首先,记住以下几点:
- 分配的东西
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按值(而不是存储指向它的指针),这样您就不必弄乱智能指针、释放或任何其他东西。