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;`? [复制]