#include <iostream>
class Dude
{
public:
int age;
Dude(int age)
{
this->age = age;
}
};
int main(int argc, char* argv[])
{
Dude *dude1 = new Dude(21);
std::cout << dude1->age << '\n';
delete dude1;
return 0;
}
这是释放
dude1
的内存并销毁对象dude1
的正确方法吗?
如果保留为默认析构函数,析构函数会做什么内存释放和清理?
dude1->~Dude();
这段代码是做什么的?
这是释放
的内存并销毁对象dude1
的正确方法吗?dude1
是的,它在技术上是正确的。
但是,这不是 best 选项。一个 better 选项是在自动存储中创建
Dude
对象,根本不用担心它的释放/清理,让编译器为你担心,例如:
int main(int argc, char* argv[])
{
Dude dude1(21);
std::cout << dude1.age << '\n';
return 0;
}
如果你必须动态创建对象,至少使用像
std::unique_ptr
这样的智能指针,这样你就不需要手动delete
对象,例如:
#include <memory>
int main(int argc, char* argv[])
{
auto dude1 = std::make_unique<Dude>(21);
// prior to C++14, use this instead:
// std::unique_ptr<Dude> dude1(new Dude(21));
std::cout << dude1->age << '\n';
return 0;
}
如果保留为默认析构函数,析构函数会做什么内存释放和清理?
在这个例子中,什么都没有。
delete
执行两个独立的任务——它 destroys 对象(即调用它的析构函数),然后 释放对象占用的内存。析构函数不是后一个任务的一部分。
所以,在这个例子中,默认的 destructor 什么都不做,因为它没有什么可以销毁的。
Dude
有一个单独的 int
数据成员,它存储在自动存储中,因此它的内存与 Dude
对象的内存相关联。当 Dude
对象的内存被释放时(在对象被破坏之后),int
将简单地消失。
dude1->~Dude();
这段代码是做什么的?
它显式调用对象的析构函数,就像任何其他方法调用一样。但是,不要这样做,除了用
placement-new
构造的对象,例如:
int main(int argc, char* argv[])
{
// FYI, this is not the correct way to ensure the allocated memory
// is satisfactory for creating an object in it, this is simplified
// just for demonstration purposes!
char *buffer = new char[sizeof(Dude)];
Dude *dude1 = new (buffer) Dude(21);
std::cout << dude1->age << '\n';
dude1->~Dude();
delete[] buffer;
return 0;
}