使用 malloc/free 来模拟新建/删除
Using malloc/free to simulate new/delete
我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用 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 xP
将导致内存泄漏。然后操作系统很可能会为您清理内存,但C++运行时库并不能保证这种情况发生 - 这是操作系统通常作为一项不错的服务提供的东西[而且也非常方便,因为它允许我们编写不完美的代码并拥有执行if (condition) { cout << "Oh horror, condition is true, I can't continue" << endl; exit(2); }
之类的操作的代码,而不必担心当我们遇到严重错误时清理所有内容]。
然而,我的主要观点是,一旦你添加本身需要销毁的成员,这种东西就会变得非常混乱,例如
class X
{
private:
std::string str;
...
};
没有简单的方法来调用析构函数来str
。如果您决定使用例外和自动清理,情况会变得更糟。
细微的差异将new
与malloc
区分开来,delete
与free
区分开来。我相信只有当类是 POD 类型时,它们才是等效的。
我应该警告,你永远不能自由地混合这两种类型。new
必须始终由delete
平衡,而绝不能由free
平衡。同样,malloc
只能通过free
来平衡。将两者混合会导致未定义的行为。
- 创建模板类型而不新建/删除
- C++ 在请求特定字节的新建后删除
- 为什么非放置"新建"和"删除"内置于语言中,而不仅仅是常规函数?
- 来自C#的mingw DLL:为什么我必须覆盖新建/删除?
- C++ - 定义自定义新建和删除运算符时make_shared
- 使用安全零内存新建/删除时出现问题
- 奇怪的内存泄漏由C++中的新建/删除
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 无法覆盖C++中纯抽象类中的运算符删除/新建
- 混合运算符和表达式新建/删除
- 使用运算符重载(新建/删除)实现单例的优缺点
- 忽略全局覆盖的新建/删除
- 基本的新建/删除操作员日志记录
- C++自定义全局新建/删除覆盖系统库
- Realloc 和全球本地新建/删除运算符覆盖
- 使用 malloc/free 来模拟新建/删除
- 新建/删除运算符不匹配错误的严重程度
- 新建/删除导致访问冲突
- 新建/删除操作符重载和基类
- 新建/删除/免费存储和 malloc/免费/堆组合