繁体   English   中英

当类被销毁时,在类中声明的地图容器会被销毁吗?

[英]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 但这不是您发布的代码中的情况。

完成的工作是一个好方法:最好按值存储每个对象,这样就不必担心动态对象的生命周期管理。

是的。 运行类的析构函数时,其所有成员的析构函数都会运行。 确切地说,顺序为:

  1. 析构函数的主体运行
  2. 所有成员按相反的顺序被破坏
  3. 按照构造的相反顺序,所有非虚拟基类均被破坏
  4. 所有虚拟基类(按相反的构造顺序)均被破坏

通常,如果没有指针,则可以预期也不会发生内存泄漏。 并非总是这样:您可能正在使用泄漏函数,或者某些函数可能正在执行动态分配,然后返回对该对象的引用。 通过使用智能指针可以进一步改善这种情况。

避免C ++中内存泄漏的有用技术是RAII :所有标准容器都遵循RAII ,这就是为什么在容器超出范围之前无需显式clear()容器的原因。 基本原则是使类清除其析构函数中的所有资源,然后为此创建专用的类,以便您的大多数类都无需担心。

请注意,“类成员”严格是在类范围内定义的非静态成员。 如果你有

struct S {
    int* p;
};

那么pS的唯一成员,并且当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM