
目录1 .基本语法2. new和delete的底层原理重要3. placement new定位 new4. 与 malloc / free 的区别1 .基本语法int main() { int* p new int(10); // 分配一个int未初始化 int* q new int(42); // 分配一个int,初始化为42 int* r new int{ 42 }; // 相当于 new int(42) int* a new int[10]; // 分配10个int内置类型默认未初始化 int* b new int[10](); // 分配10个int,值初始化为0 int* c new int[10] {1, 2, 3}; // 初始化3个数据剩下的均初始化为0 delete p; delete q; delete r; delete[] a; delete[] b; delete[] c; return 0; }delete 和 delete[ ] 不能混用int* p new int(1); delete[] p; // 错误 int* arr new int[10]; delete arr; // 错误2. new和delete的底层原理重要new 和 delete 是关键字operator new 和 operator delete 是全局函数new和delete功能的实现是在底层调用这两个函数来实现的。new 表达式的底层执行流程调用 operator new 函数分配原始内存operator new 底层通常使用 malloc 来申请空间并且包含异常处理机制抛异常。编译器生成代码在分配好的内存上调用该类的构造函数完成对象的初始化。delete 表达式的底层执行流程调用对象的析构函数清理对象资源。调用 operator delete 函数释放内存 operator delete 底层通常使用 free 来释放空间。3. placement new定位 newplacement new 的作用在已经分配好的内存上构造对象不负责分配内存是对指针指向的空间按调用构造函数构造函数不能像普通成员函数那样直接调用int main() { // 使用 operator new 分配原始内存此时并未构造 A 对象 A* p7 (A*)operator new(sizeof(A)); // 构造函数不能像普通成员函数那样直接调用例如 p7-A(1) 是非法的 // 必须使用 placement new 在已分配的内存上构造对象 //p7-A(1); new(p7)A(1); p7 -~A(); // 但是析构能显式调 operator delete (p7) return 0; }4. 与 malloc / free 的区别特性new/deletemalloc/free构造/析构调用不调用返回类型具体类型指针void*大小计算自动手动失败抛bad_alloc或返回nullptr返回NULL数组new[]/delete[]手动计算注意malloc与freenew与delete不要错配使用否则可能会崩溃