目录
1. C++中动态内存管理
2. operator new与operator delete函数
3. new和delete的实现原理
4. 定位new表达式(placement-new)
1. C++中动态内存管理
1.1 new/delete操作内置类型
内置类型的使用:
int main()
{// 一个int的大小空间int* p1 = new int;// 指定初始化int* p2 = new int(10);// n个int大小的空间int* p3 = new int[10];// 指定n个int大小的空间,不够补0int* p4 = new int[10] {1,2,3};delete p1;delete p2;// new[]和delete[]配合使用delete[] p3;delete[] p4;return 0;
}
自定义类型的使用:
class A
{
public:A() { cout << "A()" << endl; }~A() { cout << "~A()" << endl; }
};int main()
{A* p1 = new A;A* p3 = new A[2];// malloc 不调用构造函数,只是负责开空间A* p2 = (A*)malloc(sizeof(A));A* p4 = (A*)malloc(sizeof(A) * 10);delete p1;delete[] p3;// free 不调用析构函数,只是负责释放空间free(p2);free(p4);return 0;
}
2. operator new与operator delete函数
1. new和delete是用户进行动态内存申请和释放的操作符。
1.1 operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
_CRT_SECURITYCRITICAL_ATTRIBUTE
void* __CRTDECL operator new(size_t const size)
{for (;;){if (void* const block = malloc(size)){return block;}if (_callnewh(size) == 0){if (size == SIZE_MAX){__scrt_throw_std_bad_array_new_length();}else{__scrt_throw_std_bad_alloc();}}// The new handler was successful; try to allocate again...}
}
3. new和delete的实现原理
1. 内置类型

2. 自定义类型
1. new的原理/delete的原理
1. new 调用operator new函数申请空间。
2. 在申请的空间上执行构造函数,完成对象的构造。
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间

2. 如果不匹配使用会有什么情况?



4. 定位new表达式(placement-new)
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列
malloc/new区别:
1. malloc失败返回空指针,new失败抛异常进行捕获。
2. 自定义类型,malloc不调用构造函数只负责开空间,new则会调用构造函数。
3. malloc是函数,new是操作符。
4. malloc不能指定初始化,new可以。
5. malloc要手动计算需要的资源大小,new不用。
6. malloc申请的空间得强转需要的资源大小,new返回的就是需要的资源大小。
free/delete的区别:
1. 自定义类型,free不会调用析构函数,delete则会调用。
2. free是函数,delete是操作符。