主要介绍一下new和malloc的区别。

new 和 malloc 内部的实现方式有什么区别?

new是在堆上创建一个对象,并且返回本对象的指针。

他会调用类的构造函数。

如果使用malloc,那么就单纯的开辟一片空间,强行解释说这是一个对象。对于非对象的内容来说,两个或许并没事什么区别,但是对于对象而言,区别就大了。举例子:

#include <iostream>
#include <malloc.h>

class TEST
{
private:
    int num1;
    int num2;
public:
    TEST()
    {
        num1 = 10;
        num2 = 20;
    }
    void Print()
    {
        std::cout << num1 << " " << num2 << std::endl;
    }
};

int main(void)
{
    // 用malloc()函数在堆区分配一块内存空间,然后用强制类型转换将该块内存空间
    // 解释为是一个TEST类对象,这不会调用TEST的默认构造函数
    TEST * pObj1 = (TEST *)malloc(sizeof(TEST));
    pObj1->Print();

    // 用new在堆区创建一个TEST类的对象,这会调用TEST类的默认构造函数
    TEST * pObj2 = new TEST;
    pObj2->Print();

    return 0;
}

最总结果可以发现,

由于malloc没有调用构造函数,所以值为-842150451,这个值是0xCCCCCCCC 的十进制表示,常见于:

1.调试模式下的未初始化内存:许多编译器(如 MSVC)会用 0xCC 填充未初始化内存,帮助检测未初始化变量。
2.内存损坏标记:某些环境用特定模式(如 0xDEADBEEF)标记释放的内存。

而对于new的对象,则正常执行了析构函数。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐