前言
new与malloc 的细节;
一、重点直出:
1.new与delete
char* temp2 = new char;
delete temp2;
temp2 = NULL;
char* temp2 = new char[50]{'1'};
delete []temp2 ;
temp2 = NULL;
初始化是为了后面都带上’\0’;否则是乱的数据,后面在结尾需要自己加上’\0’。
数组的申请对应着数组的释放。
delete 结束后需要将指针指向NULL,防止double delete, 会让程序崩溃。
new失败后会报异常,所以应该不需要判断。但是看过一些书,说以前的C++new失败会返回空指针,虽然已经忘了是多久以前,什么版本的了。但是明显现在是不会的。
2.malloc与free
char* temp = (char*)malloc(30*sizeof(char));
if (temp == NULL)
{
/* print error message! */
}
free(temp);
temp = NULL;
malloc 返回的指针是void*,需要转换。
空间的申请需要加上sizeof,因为malloc 是按照字节为单位的。如果申请int、或者自定义类型,则sizeof舍弃不得。
malloc 失败会返回空指针,使用之前需要判断。
free一块malloc的指针后,需要将指针置为NULL,可以避免double free。
二、更多细节
free空指针不会造成影响。但是对一个指针double free是绝对不行的。所以需要free完了实现空指针。
new与直接声明区别在于:内存空间不同,生命周期不同,内存空间的动态实现与否。
delete空指针同样是安全的!但是同样存在double delete 的问题,同样会使得程序崩溃。
**malloc(0)**会返回NULL 或者返回一个应该释放掉的内存,linux为后者。即,返回的内存指针需要释放,而不是我们去用。