我看过很多在线文章和书籍,但我仍然无法得到答案。 代码是::
#include <iostream>
#include <vector>
using namespace std;
class a
{
public :
~a()
{
cout << "destroy";
}
};
int main()
{
vector <a*> *v1 = new vector<a*>;
vector <a> *v2 = new vector<a>;
return 0;
}
答案是&#34;没有析构函数调用&#34;但我不明白为什么?? 提前谢谢。
答案 0 :(得分:3)
你是“新”对象,所以为了销毁它们,你必须删除它们。
在第一行中,您正在创建指向指针向量的指针,因此您必须删除内容才能执行析构函数。删除向量会清空它们,但内容的内存将永远丢失。
在第二行中,您将创建一个指向对象矢量的指针。当破坏矢量(通过删除它)时,析构函数将执行。
在任何情况下,你都没有用任何数据填充你的向量,所以没有任何破坏可以说。
答案 1 :(得分:1)
对于要调用的析构函数,需要删除对象。
当堆栈上有局部变量时,如
vector<a> v3;
将调用v3的析构函数,当元素超出范围时,它会调用元素的析构函数。
当你使用指针并且它们超出范围时,不会调用它们指向的对象的析构函数。
在您的情况下,您在堆上有手动分配内存,因此您需要手动取消分配。
所以当你添加
delete v2;
它将删除向量v2及其元素。
v1现在是一个指针向量的指针。所以即使
delete v1;
是不够的,因为它只删除了向量中的指针而不是对象。在删除矢量之前,您必须手动为矢量中的每个元素调用delete。