C ++-析构函数只是释放内存还是实际上删除了对象?

mat*_*eal 1 c++ pointers destructor memory-management

为了检查这一点,我运行了这个小的测试代码。

#include <iostream>
using namespace std;

class name {
public:
  int data;
  name(int data) {
    this->data = data;
  }
  void printData() {
    cout << data << endl;
  }
};

int main() {
  name* namePointer;
  {
    name n(5);
    namePointer = &n;
  }
  namePointer->printData();
}
Run Code Online (Sandbox Code Playgroud)

因此,有两个问题:

  1. name对象n在块内创建main和它的指针被保存,以确保它的析构函数被调用时,我们该块脱身。但是指针指向同一个对象,并且其成员函数仍然可以访问。这不是说还没有删除对象吗?

  2. 说我将其添加到我的name班级:

    ~name() {
        cout << "destructor called" << endl;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    覆盖析构函数并且在其中不做任何事情(在中~name())是否可以防止删除对象?

编辑:感谢您的答复,它确实有所帮助。但是,请允许我知道这些否决票的原因,我认为这是一个非常好的问题。¯_(?)_ /¯

eer*_*ika 5

析构函数只是释放内存还是实际删除对象

析构函数调用子对象的析构函数(如果有),执行析构函数主体(如果已定义)。从技术上讲,释放内存的不是析构函数。可以在不取消分配的情况下调用析构函数,并且可以在不调用析构函数的情况下对内存进行分配。

当使用operator删除动态对象时delete,将调用析构函数,然后释放内存。同样,当自动变量(例如your n)的生命周期结束时,其析构函数将被调用,并且内存将被释放。

您不清楚“删除对象”是什么意思。析构函数永远不会调用delete运算符(除非析构函数{,子对象的}主体的子对象调用delete运算符,但是不是this被删除的对象)。

如果你的意思是否析构函数销毁的对象,那么这是其他方法“圆:当一个对象被销毁,其析构函数会被调用。

  1. ...但是指针指向同一个对象

指针指向对象所在的位置。该对象已被破坏,不再存在。

...及其成员函数仍可访问。

成员函数的可访问性不取决于所指出的内容。取消引用未指向对象的指针(包括调用成员函数)具有未定义的行为。

这不是说还没有删除对象吗?

不可以。您无法根据不确定的行为得出结论。

  1. 是否覆盖析构函数...

这不是最重要的。覆盖是涉及继承和虚拟功能的特定语言术语。

您要做的是定义一个析构函数。

  1. ...并且在其中什么也不做(在〜name()中),防止该对象被删除?

不需要。在析构函数的主体中不执行任何操作与隐式析构函数(在未定义析构函数时对象拥有的对象)完全相同。它不“防止删除对象形式”。