gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:59 24 4
gpt4 key购买 nike

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

#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();
}

那么,两个问题:

  1. name 对象 nmain 的 block 中创建并保存它的指针,以确保它的析构函数是当我们离开街区时被调用。但是指针指向同一个对象,它的成员函数仍然可以访问。这不是说对象还没有删除吗?

  2. 假设我将此添加到我的name 类中:

    ~name() {
    cout << "destructor called" << endl;
    }

    重写析构函数而不在其中执行任何操作(在 ~name() 中)是否会阻止对象被删除?

编辑:感谢您的回复,它真的很有帮助。但我可以知道这些反对票的原因吗,我认为这是一个非常好的问题。 ¯_(ツ)_/¯

最佳答案

Does the Destructor just deallocates the memory or actually deletes the object

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

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

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

如果你的意思是析构函数是否销毁对象,那么它是相反的:当一个对象被销毁时,它的析构函数将被调用。

  1. ... But the pointer points to the same object

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

... and its member functions are still accessible.

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

Doesn't this mean that the object isn't deleted yet?

没有。你不能从未定义的行为中得出结论。

  1. Does overriding the destructor function ...

这不是覆盖。覆盖是一个特定的语言术语,涉及继承和虚函数。

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

  1. ... and doing nothing in it (here in ~name()), prevent the object from being deleted?

没有。在析构函数的主体中什么也不做与隐式析构函数所做的完全相同(当您未定义析构函数时对象所具有的那个)。它不会“阻止对象表单被删除”。

关于C++ - 析构函数只是释放内存还是实际上删除了对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45463177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com