使用 malloc/free 来模拟新建/删除

Using malloc/free to simulate new/delete

本文关键字:新建 删除 模拟 free malloc 使用      更新时间:2023-10-16

我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用 new/deletemalloc/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。如果您决定使用例外和自动清理,情况会变得更糟。

有许多

细微的差异将newmalloc区分开来,deletefree区分开来。我相信只有当类是 POD 类型时,它们才是等效的。

我应该警告,你永远不能自由地混合这两种类型。new必须始终由delete平衡,而绝不能由free平衡。同样,malloc只能通过free来平衡。将两者混合会导致未定义的行为。