猿问

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

问题描述

环境是科学计算软件,速度非常关键。

比如有一个类
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。

因为

  1. *p是一个占空间大,算起来很慢,很可能用户用不到的成员,所以使用指针来存的

  2. 同样因为p计算代价太大了,算了之后就不想再次重新计算

  3. 同样的理由,不想实现rule of 3,不想遍历p,或者把*p深拷贝处理

想要的回答

目前我使用在scope外面保存A的临时变量的方法来加强临时变量的生命周期,比如
vector tmp;
for(){
tmp.insert(A());
A & a = tmp[i];
if(validate(a))vector.insert(a);
}
因为与*p相关的业务逻辑到这里就完了所以还好,
但我想知道有没有更标准更优雅点的方法?


慕婉清6462132
浏览 785回答 1
1回答

守候你守候我

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

相关分类

Html5
Android
我要回答