前言:
此时朋友们对“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分配内存失败