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

标签 c++

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

相关文章:

c++ - 有人给我一个使用 QVector::QVector(std::initializer_list<T> args) 的例子吗?

c++ - 模板大小递归——构造函数多重重载

c++ - 如何使用 C++ 返回一个抽象类

c++ - 将 std::web_view 工具引入标准有什么好处?

c++ - Qt 获取布局中所有 QLineEdits 的文本

c++ - 检测对堆栈变量的调用删除(使用转换为指针的运算符)

c++复制构造函数,复制随机值后

c++ - 用于 Linux 的 PostMessage

c++ - GDB:显示函数将我的 {type} 的地址打印为整数——想更改为十六进制

c++ - 如何欺骗 boost::asio 以允许仅 move 处理程序