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)
因此,有两个问题:
该name对象n在块内创建main和它的指针被保存,以确保它的析构函数被调用时,我们该块脱身。但是指针指向同一个对象,并且其成员函数仍然可以访问。这不是说还没有删除对象吗?
说我将其添加到我的name班级:
~name() {
cout << "destructor called" << endl;
}
Run Code Online (Sandbox Code Playgroud)
覆盖析构函数并且在其中不做任何事情(在中~name())是否可以防止删除对象?
编辑:感谢您的答复,它确实有所帮助。但是,请允许我知道这些否决票的原因,我认为这是一个非常好的问题。¯_(?)_ /¯
析构函数只是释放内存还是实际删除对象
析构函数调用子对象的析构函数(如果有),执行析构函数主体(如果已定义)。从技术上讲,释放内存的不是析构函数。可以在不取消分配的情况下调用析构函数,并且可以在不调用析构函数的情况下对内存进行分配。
当使用operator删除动态对象时delete,将调用析构函数,然后释放内存。同样,当自动变量(例如your n)的生命周期结束时,其析构函数将被调用,并且内存将被释放。
您不清楚“删除对象”是什么意思。析构函数永远不会调用delete运算符(除非析构函数{,子对象的}主体的子对象调用delete运算符,但是不是this被删除的对象)。
如果你的意思是否析构函数销毁的对象,那么这是其他方法“圆:当一个对象被销毁,其析构函数会被调用。
- ...但是指针指向同一个对象
指针指向对象所在的位置。该对象已被破坏,不再存在。
...及其成员函数仍可访问。
成员函数的可访问性不取决于所指出的内容。取消引用未指向对象的指针(包括调用成员函数)具有未定义的行为。
这不是说还没有删除对象吗?
不可以。您无法根据不确定的行为得出结论。
- 是否覆盖析构函数...
这不是最重要的。覆盖是涉及继承和虚拟功能的特定语言术语。
您要做的是定义一个析构函数。
- ...并且在其中什么也不做(在〜name()中),防止该对象被删除?
不需要。在析构函数的主体中不执行任何操作与隐式析构函数(在未定义析构函数时对象拥有的对象)完全相同。它不“防止删除对象形式”。
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |