关于析构函数的疑惑
题目:找错
#include <vector>
using namespace std;
class CDemo{
public:
CDemo():str(NULL){}
~CDemo(){if(str) delete [] str;}
char *str;
};
int main()
{
CDemo d1;
d1.str = new char[32];
strcpy(d1.str, "trend micro");
vector<CDemo> *a1 = new vector<CDemo>();
a1 -> push_back(d1);
delete a1;
return 0;
}
书上说这段程序的错误是vector对象指针能够自动析构,所以不需要调用delete a1,
否则会造成两次析构。
但是我认为不是这样,因为vector<CDemo>是通过new建立在堆上,如果不delete的话
会一直存在,执行完delete a1;后会调用vector<CDemo>中的d1的析构
函数。反之,在整个程序执行结束时,一开始在栈上创建的d1因为超出作用域而自动调用
析构函数,而在vector<CDemo>中的d1由于是在栈上创建的对象的副本,位于堆上,不delete
的话就会一直存在,从而可能造成内存泄露。
不知道我的理解对不对?