
melloc和new的区别对于普通的数据类型来说malloc和new没什么区别但是对类来说malloc仅仅是分配内存而new除了调用标准库函数operator new() 分配内存还调用构造函数来初始化内存。代码示例class T { int m_count{}; static int count; public: T() { cout 第 count 个T被构造 endl; } int test 2; }; int T::count 0; int main() { T* t1 (T*)malloc(10*sizeof(T)); cout t1 t1 endl; cout t1[2].test endl;; }打印结果说明malloc并未对类进行初始化构造仅仅是开辟了内存空间。换成new的代码示例class T { int m_count{}; static int count; public: T() { cout 第 count 个T被构造 endl; } int test 2; }; int T::count 0; int main() { T* t2 new T[5]; }打印结果free与delete的区别对于普通的数据类型来说free和delete没什么区别但是对类来说free仅仅是释放内存而delete除了调用标准库函数operator delete() 释放内存还调用析构函数。代码示例class T { int m_count{}; static int count; public: T() { cout 第 count 个T被构造 endl; } int test 2; ~T() { cout 调用了析构函数\n; } }; int T::count 0; int main() { T* t2 new T; delete t2; t2 nullptr; }打印结果delete与delete[]的区别对于普通的数据类型来说 delete 和 delete[] 没有什么区别,但是对于类来说, delete 仅仅是释放内存空间且调用第一个元素的析构函数而 delete[] 不仅释放内存空间还会调用每一个元素的析构函数。new与delete的重载重载new和delete运算符的目是为了自定义内存分配的细节。构造函数和析构函数由编译器调用我们无法控制。但是可以重载内存分配函数operator new()和释放函数operator delete()。代码演示class exa { public: int m_hp; int m_mp; exa(int hp, int mp) { m_hp hp; m_mp mp; cout 调用了构造函数\n; } ~exa() { cout 调用了析构函数\n; } }; //重载new运算符的函数 void* operator new(size_t size) //参数必须是size_tunsigned long long返回值必须是void* { cout 调用了重载的new: size 字节。\n; void* ptr malloc(size); //申请内存 cout 申请到的内存地址是 ptr endl; return ptr; } //重载delete运算符的函数 void operator delete(void* ptr) //参数必须是void*返回值必须是void { cout 调用了重载的delete。\n; if (ptr 0) return; //对空指针delete是安全的 free(ptr); ///释放内存 } int main() { exa* p2 new exa(3, 8); cout p2的地址是 p2 hp p2-m_hp mp p2-m_mpendl; delete p2; }打印结果注意在栈上创建对象和在堆内创建对象的区别。如代码中 exa* p2 new exa(3, 8);表示在堆内创建对象销毁对象时必须手动 delete 才会调用析构函数并释放内存空间。如果写成 exa p2(3,8); 则是在展上创建对象编译器会自动调用构造函数自动调用析构函数和内存释放。