使用 malloc/free 模拟 new/delete
Posted
技术标签:
【中文标题】使用 malloc/free 模拟 new/delete【英文标题】:Using malloc/free to simulate new/delete 【发布时间】:2013-10-21 21:30:06 【问题描述】:我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用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
,程序结束时会自动调用析构函数,但不会释放空闲存储区(即xP
的空闲存储区,a
字段的空闲存储区将被释放)。使用delete xP
时,会调用析构函数,然后完全释放空闲存储。
如果我错了,请纠正我。
【问题讨论】:
如果你不调用delete
,除非你手动调用,否则析构函数不会被调用。
...如果您不调用new
,则不会调用构造函数。
...没什么好说的...
@Irbis:或者对于另一个对象中的对象,它们是直接成员(不是通过 new 创建的)。就像我在回答中使用std::string
的例子一样。
析构函数也可以在使用smart pointer时自动调用。
【参考方案1】:
您的问题的实际答案是您不正确,不调用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
的析构函数。如果您决定使用异常和自动清理,情况会变得更糟。
【讨论】:
【参考方案2】:new
与 malloc
以及 delete
与 free
之间存在许多细微差别。我相信只有当类是 POD 类型时它们才是等价的。
我应该警告你永远不能随意混合这两种类型。 new
必须始终由 delete
平衡,而不是 free
。同样,malloc
必须仅由free
平衡。将两者混合会导致未定义的行为。
【讨论】:
这里有一个关于 POD 类型的好链接:***.com/questions/146452/what-are-pod-types-in-c以上是关于使用 malloc/free 模拟 new/delete的主要内容,如果未能解决你的问题,请参考以下文章