【问题标题】:C++ Memory Management: Who is responsibleC++ 内存管理:谁负责
【发布时间】:2013-07-01 22:03:01
【问题描述】:

假设我正在编写一个 C++ 类。该类具有以下字段:

  • 一个整数。
  • 一个 C++ 字符串
  • 可动态调整大小的整数数组和指向它的指针。

在析构函数中,我知道我必须 delete 之前通过调用 new 声明的任何内容。在这种情况下,我知道我必须释放用于 int 数组的空间。字符串的内存呢?我知道我不负责释放它的内存,因为我没有调用new 来分配它,但是它是如何被释放的呢? C++ 什么时候调用它的析构函数?

【问题讨论】:

  • 当它超出范围时,就像你的类的析构函数一样。
  • 顺便说一句,你应该用std::vector<int> 实例替换你的“动态调整大小的整数数组”——现在你甚至不必删除数组,你可能可以完全省略你的析构函数。记住单一职责原则:你的类应该对它设计的任何事情负责,将内存管理留给为特定范围编写的类。

标签: c++ memory-management


【解决方案1】:

字符串的内存呢?我知道我不负责释放它的内存,因为我没有调用 new 来分配它,但是它是如何被释放的呢?

您的类的析构函数隐式调用std::string 的析构函数,后者又处理释放自己的资源。没什么好担心的。

C++ 什么时候调用它的析构函数?

当你的类对象的析构函数被调用时。这意味着当该对象超出范围或在由new 创建时在指向它的指针上调用了delete。

我以某种方式理解您的问题。你可能认为 new 递归地 news 是你班级的成员。不,它不是那样做的。除非您的类本身对成员变量执行new,否则您需要对它们调用delete。

【讨论】:

    【解决方案2】:

    一旦实例析构函数完成,成员变量的析构函数就会自动调用。

    【讨论】:

    • 它们是在实例析构函数之前还是之后调用?一旦调用实例析构函数,它不会丢失指向它的指针吗?
    • @user2380088:不是真的。你可以想象编译器偷偷把代码mystring.~string();添加到你的析构函数体的末尾。
    • ... 对于派生类,它会将对Base::~Base() 的调用添加到最后。这是非常有意地以相反的构造顺序。
    【解决方案3】:

    当变量超出范围时,该内存被回收。

    【讨论】:

    • 为了迂腐,“范围”是 names 的属性(即程序员与之交互的符号)。我们在这里谈论的是对象,所以“生命周期”是相关的概念......
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多