问题描述环境是科学计算软件,速度非常关键。比如有一个类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成员函数。
- 1 回答
- 0 关注
- 784 浏览
添加回答
举报
0/150
提交
取消