龙空技术网

C++面试题解析之 malloc/free 与new/delete的区别

攻城狮Soar 54

前言:

此时朋友们对“new分配内存失败”大约比较关切,看官们都需要了解一些“new分配内存失败”的相关资讯。那么小编同时在网摘上收集了一些关于“new分配内存失败””的相关文章,希望大家能喜欢,咱们一起来了解一下吧!

在C++编程语言中,malloc都可以进行动态内存分配,下面来解析这两者之间的区别。

1)语法不同:

malloc是函数,new是关键字。

malloc是C语言的标准库函数,使用时需要include <cstdlib> 头文件。使用malloc分配的内存要用free释放。

new是C++的关键字,使用时需要include <new>头文件,使用new分配的内存要用delete释放。New/delete关键字是可以被重载的,这大大提高了代码的灵活性。

2)内存分配的返回类型不同:

malloc 返回类型是 void* 指针,需要手动进行类型转换以匹配所需的指针类型。

比如:

int *p = (int*)malloc(sizeof(int));

new 返回所分配类型的指针,无需进行类型转换。

比如:

int *p = new int(10)

3)初始化方式不同:

malloc只负责内存的分配,分配的是未初始化的内存。使用前需要初始化(每个成员变量复制或者使用函数如memset,memcpy等)。

new不仅负责分配内存,还会自动调用构造函数对分配的内存进行初始化。

同理,delete也会自动调用析构函数。

例:

#define OK 0

void PRINT(const std::string &info)

{

std::cout << info << std::endl;

};

struct TestA

{

TestA() { PRINT(" Construct TestA");}

virtual ~TestA() { PRINT(" Destructor TestA");}

};

int main(int argc, char** argv)

{

PRINT("New TestA");

TestA *a1 = new TestA;

PRINT("Delete TestA");

delete a1;

TestA *a2 = (TestA*)malloc(sizeof(TestA));

PRINT("Free TestA");

free(a2);

return OK;

}

运行结果:

New TestA

Construct TestA

Delete TestA

Destructor TestA

Malloc TestA

Free TestA

4)malloc分配指定大小的内存,。

New根据new的对象类型自动计算内存大小。

内存管理的责任不同:

5)异常处理:

malloc分配失败返回nullptr。

new分配失败会抛出std::bad_alloc异常。

总而言之,在使用C++开发过程中,优先使用new来进行动态内存分配 ,除非有特殊的需求。

标签: #new分配内存失败