我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用 new
/delete
获得相同的效果和 malloc
/free
。除了不使用构造函数初始化列表之外,还有哪些其他约束?您认为以下代码以正确的方式模拟了新建/删除行为吗?
#include <iostream>
using namespace std;
class X
{
private:
int* a;
public:
X(int x)
{
this->a = new int;
*(this->a) = x;
}
~X() { delete this->a; }
int getA() { return *(this->a); }
};
class Y
{
private:
int* a;
public:
void CTor(int x)
{
this->a = new int;
*(this->a) = x;
}
void DTor() { delete this->a; }
int getA(){ return *(this->a); }
};
void main()
{
X *xP = new X(44);
cout<<xP->getA()<<endl;
delete xP;
Y *yP = static_cast<Y*>(malloc(sizeof(Y)));
yP->CTor(44);
cout<<yP->getA()<<endl;
yP->DTor();
free(yP);
system("pause");
}
如果不使用delete xP
,程序结束时会自动调用析构函数,但不会释放一个空闲存储区(即free store for xP
,free store for字段 a
将被释放)。当使用 delete xP
时,析构函数被调用,然后一个空闲存储被完全释放。
如果我错了,请纠正我。
最佳答案
您问题的实际答案是您不正确,没有调用 delete xP
会导致内存泄漏。操作系统很可能随后会为您清理内存,但 C++ 运行时库并不能保证会发生这种情况——这是操作系统通常作为一项很好的服务提供的东西 [而且它也非常方便,因为它允许我们编写不完美的代码并拥有类似 if (condition) { cout << "Oh horror, condition is true, I can't continue" << endl; exit(2); }
的代码当我们遇到严重错误时,不必担心清理所有东西]。
然而,我的主要观点是,一旦您添加本身需要销毁的成员,例如,这种东西就会变得非常困惑。
class X
{
private:
std::string str;
...
};
没有简单的方法可以为 str
调用析构函数.如果您决定使用异常和自动清理,情况会变得更糟。
关于c++ - 使用malloc/free模拟new/delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505112/