为了账号安全,请及时绑定邮箱和手机立即绑定

c++带指针,带析构函数的类的临时变量如何放入vector?

c++带指针,带析构函数的类的临时变量如何放入vector?

慕婉清6462132 2018-11-17 17:20:06
问题描述环境是科学计算软件,速度非常关键。比如有一个类A{public:T * p = NULL;A(){}T* getP () {if(p == NULL)p=new T(); return p;}~A() (if(p!=NULL){delete p;p=NULL;})}现在需要for(){A a();if(validate(a))vector.insert(a);}此时,由于变量a的作用域仅仅在for循环内部,在跳出当前循环步的时候就会调用析构函数。如果用户选择了与p有关的功能,就会删掉有价值的p,此时vector内部的a的拷贝却不知道已经删除了,因此会造成bug。因为*p是一个占空间大,算起来很慢,很可能用户用不到的成员,所以使用指针来存的同样因为p计算代价太大了,算了之后就不想再次重新计算同样的理由,不想实现rule of 3,不想遍历p,或者把*p深拷贝处理想要的回答目前我使用在scope外面保存A的临时变量的方法来加强临时变量的生命周期,比如vector tmp;for(){tmp.insert(A());A & a = tmp[i];if(validate(a))vector.insert(a);}因为与*p相关的业务逻辑到这里就完了所以还好,但我想知道有没有更标准更优雅点的方法?
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

变量a为啥一定要放在for循环内部?
因为a的p指针实际作用域根本就不局限在for循环内部,所以变量a在for循环中声明是完全没意义的行为。
当然,如果你认为一定坚持要在for循环内部声明变量a,那么可以这么做:
删除类A的析构函数中的释放delete操作,专门写一个A类的成员函数,用于delete p,然后在vector使用完手动调用A的delete成员函数。

查看完整回答
反对 回复 2018-11-17
  • 1 回答
  • 0 关注
  • 784 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信