是否会调用析构函数,然后由于哪个向量?

时间:2016-08-31 11:04:04

标签: c++ vector destructor

我看过很多在线文章和书籍,但我仍然无法得到答案。 代码是::

#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;但我不明白为什么?? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

你是“新”对象,所以为了销毁它们,你必须删除它们。

在第一行中,您正在创建指向指针向量的指针,因此您必须删除内容才能执行析构函数。删除向量会清空它们,但内容的内存将永远丢失。

在第二行中,您将创建一个指向对象矢量的指针。当破坏矢量(通过删除它)时,析构函数将执行。

在任何情况下,你都没有用任何数据填充你的向量,所以没有任何破坏可以说。

答案 1 :(得分:1)

对于要调用的析构函数,需要删除对象。

当堆栈上有局部变量时,如

vector<a> v3;

将调用v3的析构函数,当元素超出范围时,它会调用元素的析构函数。

当你使用指针并且它们超出范围时,不会调用它们指向的对象的析构函数。

在您的情况下,您在堆上有手动分配内存,因此您需要手动取消分配

所以当你添加

delete v2;

它将删除向量v2及其元素。

v1现在是一个指针向量的指针。所以即使

delete v1;

是不够的,因为它只删除了向量中的指针而不是对象。在删除矢量之前,您必须手动为矢量中的每个元素调用delete。