首先,记住以下几点:
- 分配的东西
malloc
需要释放free
- 不要使用
malloc
- 分配的东西
new
必须由delete
- 分配的东西
new[]
必须由delete[]
- 一份
delete
一份,new
一份一份delete[]
new[]
- 不要使用上述任何一种
那么,你的想法是正确的,没有析构函数,分配的内存malloc
将不会被释放。如果您遵循上述规则,那么您需要使用free
( notdelete[]
) 来释放它:
ClassX::~ClassX() { free(p); }
但是,您首先不应该malloc
在 C++ 中使用,因为它不调用对象的构造函数,您应该使用new
:
ClassX::ClassX() : p(new int) { }
// NOW we use delete since we used new (not delete[] since we didn't use new[])
ClassX::~ClassX() { delete p; }
但是,如果这样做,则必须编写复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符。那么让我们看一个更好的方法:
class ClassX{
private:
ClassX();
std::unique_ptr<int> p;
int i;
....
};
// we have to break rule #6 here
ClassX::ClassX() : p(new int) { }
现在您甚至不必编写析构函数,您只需让智能指针为您处理它,因为它会在调用析构函数时自动调用delete
您使用的东西new
。这导致我们...
你的另一个问题:
它释放了 malloc 分配的内存,但没有释放为类的字段(即 i 和 p)分配的内存?
这大约是正确的 1/4。因为i
和p
是类的成员,所以当封闭类被释放时,它们会自动被释放,如果它们本身是类,它们的析构函数将被调用。因此,如果您放入delete
析构函数,它会处理由 分配的内存new
,i
并且p
会自动清理,一切都很好。(你只正确了 1/4,因为你使用了错误的释放函数。)
这意味着,如果你使用智能指针,当你的对象被破坏时,智能指针的析构函数会被调用,它会自动释放你分配new
给你的东西。所以你甚至不需要担心它。
这一切都假设你真的想在你的课程中加入动态int
。如果可以的话,您更愿意存储int
按值(而不是存储指向它的指针),这样您就不必弄乱智能指针、释放或任何其他东西。