📜  C++中的new vs malloc()和free()vs delete(1)

📅  最后修改于: 2023-12-03 15:29:53.816000             🧑  作者: Mango

C++中的new vs malloc()和free() vs delete

C++中有两种方法来动态分配内存:new操作符和malloc()函数。同样,释放内存也有两种方法:delete操作符和free()函数。这两种方法在使用时都有一些细微但很重要的差别。

newdelete
动态分配内存

使用new操作符可以动态分配内存,语法如下:

new type;

例如:

int* p = new int;

以上代码分配了一个整数的空间,并将返回的指针分配给pnew操作符分配的内存大小是在运行时计算的。

动态释放内存

使用delete操作符可以动态释放内存,语法如下:

delete ptr;

例如:

int* p = new int;
// ...
delete p;

这将释放p所指的整数所占用的空间。

注意事项
  • 使用new操作符分配内存时需要注意,如果无法分配所需的内存,将抛出std::bad_alloc的异常。而使用malloc()函数则不会抛出异常。
  • 当使用new操作符分配动态内存时,如果指针指向的是一个对象,那么调用delete时会自动调用对象的析构函数。而使用malloc()函数分配内存时,则需要手动调用对象的析构函数。
  • 如果使用delete操作符时,指针是空指针,那么什么也不会发生。但如果使用free()函数时,指针是空指针,则程序将崩溃。
  • 不要在使用new操作符分配内存后使用free()函数释放内存,也不要在使用malloc()函数分配内存后使用delete操作符释放内存。这样做会导致程序行为未定义。
malloc()free()
动态分配内存

使用malloc()函数可以动态分配内存,语法如下:

malloc(size_t size);

例如:

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

以上代码分配了一个整数的空间,并将返回的指针分配给pmalloc()函数分配的内存大小是在编译时计算的。

动态释放内存

使用free()函数可以动态释放内存,语法如下:

free(ptr);

例如:

int* p = (int*)malloc(sizeof(int));
// ...
free(p);

这将释放p所指的整数所占用的空间。

注意事项
  • 使用free()函数释放内存时,指针必须是指向使用malloc()calloc()函数所返回的指针。否则程序将行为未定义。
  • 不要在使用malloc()函数分配内存后使用delete操作符释放内存,也不要在使用new操作符分配内存后使用free()函数释放内存。这样做会导致程序行为未定义。
总结

在C++中,new操作符和delete操作符用于动态分配和释放内存。malloc()函数和free()函数也可以用于动态分配和释放内存。但需要注意的是,这两种方法在使用时都有一些细微但很重要的差别。在使用时,需要根据需求选择合适的方法,以免出现意料之外的行为。