[英]Is map container declared in class getting destroyed when the class is destroyed?
当对象a
被销毁时, personsInHouse
地图是否也被销毁,或者我需要在析构函数中销毁它? 如果不这样做,是否会造成内存泄漏?
class A {
public:
map<unsigned int, unsigned int> personsInHouse;
};
int main(){
A a;
A.hash[10] = 23;
};
personsInHouse
的生存期是自动的,因为您是按value进行存储的 ,并且它的生存期是父对象的生存期。 因为创建的a
按值 ,所以超出范围时将调用其析构函数,并且对象的析构函数会自动调用其包含的对象的析构函数。 所以,你不需要破坏personsInHouse
,就像你不需要摧毁a
。
如果personsInHouse
是指针,并且您使用new
在动态存储中创建了一个map<unsigned int, unsigned int>
并将指向它的指针存储在personsInHouse
,那么您将需要在A
的析构函数中手动取消分配personsInHouse
指向的内存通过delete
。 但这不是您发布的代码中的情况。
完成的工作是一个好方法:最好按值存储每个对象,这样就不必担心动态对象的生命周期管理。
是的。 运行类的析构函数时,其所有成员的析构函数都会运行。 确切地说,顺序为:
通常,如果没有指针,则可以预期也不会发生内存泄漏。 并非总是这样:您可能正在使用泄漏函数,或者某些函数可能正在执行动态分配,然后返回对该对象的引用。 通过使用智能指针可以进一步改善这种情况。
避免C ++中内存泄漏的有用技术是RAII :所有标准容器都遵循RAII ,这就是为什么在容器超出范围之前无需显式clear()
容器的原因。 基本原则是使类清除其析构函数中的所有资源,然后为此创建专用的类,以便您的大多数类都无需担心。
请注意,“类成员”严格是在类范围内定义的非静态成员。 如果你有
struct S {
int* p;
};
那么p
是S
的唯一成员,并且当S
超出范围时, p
将被销毁(除了调整堆栈指针外,通常不涉及任何事情)。 如果您在某个时候执行S s; sp = new int;
S s; sp = new int;
那么p
仍然是唯一的成员,并且p
指向的对象将不是一个,因此当s
超出范围时不会被破坏。 为此,您将需要手动delete sp;
,它对应于每个需要具有相应delete
new
规则( new[]
和delete[]
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.