使用 malloc/free 模拟 new/delete

Posted

技术标签:

【中文标题】使用 malloc/free 模拟 new/delete【英文标题】:Using malloc/free to simulate new/delete 【发布时间】:2013-10-21 21:30:06 【问题描述】:

我创建了一个示例类(仅用于学习目的),它不必使用构造函数初始化列表,因为我想使用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,除非你手动调用,否则析构函数不会被调用。 ...如果您不调用new,则不会调用构造函数。 ...没什么好说的... @Irbis:或者对于另一个对象中的对象,它们是直接成员(不是通过 new 创建的)。就像我在回答中使用std::string 的例子一样。 析构函数也可以在使用smart pointer时自动调用。 【参考方案1】:

您的问题的实际答案是您不正确,不调用delete xP 会导致内存泄漏。操作系统很可能会为您清理内存,但 C++ 运行时库并不保证会发生这种情况 - 这是操作系统通常提供的一项很好的服务 [而且它也非常方便,因为它允许我们编写不完美的代码并拥有像if (condition) cout &lt;&lt; "Oh horror, condition is true, I can't continue" &lt;&lt; endl; exit(2); 这样的代码,而不必担心当我们遇到严重错误时清理所有内容]。

然而,我的主要观点是,一旦您添加本身需要销毁的成员,这种东西就会变得非常混乱,例如

class X

  private:
    std::string str;
  ... 
;

没有简单的方法可以调用str 的析构函数。如果您决定使用异常和自动清理,情况会变得更糟。

【讨论】:

【参考方案2】:

newmalloc 以及 deletefree 之间存在许多细微差别。我相信只有当类是 POD 类型时它们才是等价的。

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

【讨论】:

这里有一个关于 POD 类型的好链接:***.com/questions/146452/what-are-pod-types-in-c

以上是关于使用 malloc/free 模拟 new/delete的主要内容,如果未能解决你的问题,请参考以下文章

在类中使用 malloc/free

malloc/free 的使用要点

malloc/free 的使用要点

11动态分配内存malloc/free

malloc/free与new/delete的区别与联系

与 malloc/free 相比,使用 C99 VLA 是个好主意吗?