gpt4 book ai didi

c++ - 使用malloc/free模拟new/delete

转载 作者:行者123 更新时间:2023-11-28 03:06:44 27 4
gpt4 key购买 nike

我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com