c ++在析构函数中删除向量类成员内存

Posted

技术标签:

【中文标题】c ++在析构函数中删除向量类成员内存【英文标题】:c++ deleting vector class member memory in destructor 【发布时间】:2012-06-12 03:25:02 【问题描述】:

我有一个包含向量成员变量的类。 我知道存储在堆栈中的向量将是 当它们用完时清理(即释放内存) 范围,但我不确定是否破坏了 类对象 - 包含一个向量成员变量 - 被认为超出范围。

如果不是,那么合适的破坏方式是什么 向量?

EG:

class fred 
    char *stuff;
    vector<int> v;

    fred() : stuff(), v() 
    ~fred() 
         if (stuff) free(stuff);
         // now how do I clear up the vector v?  Will it be done automatically?
    
 

【问题讨论】:

看看它是如何被标记为 C++ 的,你可能想要 new/delete 而不是 malloc/free 矢量很好。但是stuff 不安全,因为有复制构造函数和赋值运算符(因为编译器会自动生成它们)。请参阅三的规则(或 C++11 中的五)。 在新的世界,C++11 领域,你不再自己打电话给delete。您使用 unique_ptrs(通常)或 shared_ptrs(很少)为您调用它。 【参考方案1】:

矢量已经为您清理好了!当一个类被破坏时,它的所有成员析构函数也会被调用。在这种情况下,v 的析构函数被调用,它会清理它分配的所有内容。

非静态成员的 dtor 在您到达析构函数的结束 时被调用,它们的声明顺序与它们相反。然后调用您的基类析构函数(如果存在)。

【讨论】:

这很好,但我认为如果我为该类编写自己的析构函数(不依赖于默认析构函数),那么自动清理就不会发生。您是说即使我有明确的析构函数也会调用向量析构函数?? 是的。对于所有非静态、非指针成员对象,一旦您按照类定义中定义这些成员的顺序(然后调用基类 dtor)到达 dtor 主体的“”,就会自动调用 dtor这反过来又会删除基本成员,如果有的话等等......)。 @dirkgently 更正:成员的 dtor 以 reverse 顺序调用,它们在类 declaration声明我> @Dave:是的,我试图尽可能多地补习,但在这个过程中有点混淆了:/【参考方案2】:

当你销毁 fred 的实例时,将调用向量的析构函数。

【讨论】:

v 不一定在栈上!这取决于fred 的这个实例是否分配在堆栈上 哦,对了!没有考虑过这种情况:(感谢您的提醒。 如果fred 实例具有自动存储持续时间(即堆栈分配的实例),他可能不必销毁 当我说“你摧毁”时,我的意思是“当它被摧毁时”。【参考方案3】:

我认为您不需要为向量调用 DTOR。一旦对象超出范围,DTOR 就会被调用,这意味着 fred 的 DTOR 被调用。

【讨论】:

【参考方案4】:

销毁对象总是只有一种方法,那就是通过其析构函数(相反,您可以通过多种方式构造对象)。 STL 容器专门设计用于避免在数据结构中对内存进行这种微管理。如果您必须在 STL 容器中显式分配或释放内存,那么您做错了。

【讨论】:

以上是关于c ++在析构函数中删除向量类成员内存的主要内容,如果未能解决你的问题,请参考以下文章

即使内存不是动态分配的,在析构函数中是不是需要`delete ptr;`? [复制]

C++ 堆栈分配对象,显式析构函数调用

析构函数为啥能释放对象内存?

在析构函数中终止当前线程

C++基础6 继承 类型兼容 satatic 多继承 虚继承 多态 案例 虚析构函数 重载重写重定义

面向对象(构造及析构函数)