C malloc free
malloc void*malloc(size_t size) 1.半开半闭 容易越界 2.类型强转
free void free(void* ptr)
C++ new delete
new的底层实现
new创建新对象时1)分配内存2)调用构造函数
调用new会发生:
1.object *p = new object();
new->operator new->malloc 分配内存
失败调用_callnewh,为0抛出异常,非0继续分配内存
调用delete会发生
delete->operator delete->free
先调用析构函数,再调用operator delete。先销毁对象,再释放内存
new数组:
- char *p = new char[32];
new[]调用的是operator new[],计算出数组总大小之后调用operator new。
- object *p = new object[3];
new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小,最后调用三次构造函数。
delete数组:
1)int *p = int char[32]; delete p;
与普通相同
2)object *p = new object[3]; delete[] object;
释放内存之前会先调用每个对象的析构函数
- new 关键字/ malloc 函数
- new 自由存储区域 /malloc 堆上
- new 1.operator new 2.construction 还可以初始化 /malloc 单纯开辟内容
- new operator new 可以重载 /malloc 不能重载
- new 可以调用malloc / malloc不可以调用new(1.向前兼容 2.)
- 内存开辟 new 抛异常 /malloc 返回NULL
7.new 可以开辟常量 /malloc 不能
开辟数组,单个delete不会出错
int main()
{
int* p = new int[10];
//operator new [](size_t size); 0x100 40
delete p;
}
对象:内存+资源
int main()
{
Test* ptest = new Test[10]; 44
//C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小
delete ptest;//出现内存泄露,只调用一次析构函数
return 0;
}