C++拾遗--malloc free与new delete的同与不同
前言
在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete。这里我们来探讨下他们的同与不同。
正文
1.内置类型
对相同的代码进行调试,查看内存
#include <iostream> using namespace std; int main() { int *p = (int*)malloc(sizeof(int) * 10); cout << p << endl; //断点 for (int i = 0; i < 10; i++) p[i] = i; //断点 free(p); //断点 cin.get(); return 0; }
调试
同样的功能使用new和delete来操作
#include <iostream> using namespace std; int main() { int *p = new int[10]; cout << p << endl; <span style="white-space:pre"> </span>//断点 for (int i = 0; i < 10; i++) p[i] = i; <span style="white-space:pre"> </span>//断点 delete[]p; <span style="white-space:pre"> </span>//断点 cin.get(); return 0; }
调式
对于内置类型,两组操作的效果是一样的。
2.类类型
代码一
#include <iostream> using namespace std; class MyClass { public: MyClass() { cout << "MyClass create" << endl; } ~MyClass() { cout << "MyClass delete" << endl; } }; int main() { MyClass *p1 = (MyClass *)malloc(sizeof(MyClass)); free(p1); cout << "--------------------" << endl; MyClass *p2 = new MyClass; delete p2; cin.get(); return 0; }
运行
malloc 只是分配了内存,而new 不仅分配了内存,还调用了构造函数。
free 只是释放了内存,而delete不仅释放了内存,还调用了析构函数。
代码二
#include <iostream> #include <new> using namespace std; class MyClass { public: int *p; MyClass() { //分配400M内存 p = new int[1024 * 1024 * 100]; cout << "MyClass create" << endl; } ~MyClass() { delete[]p; cout << "MyClass delete" << endl; } }; int main() { MyClass *p1 = (MyClass *)malloc(sizeof(MyClass)); //断点 free(p1); //断点 MyClass *p2 = new MyClass; //断点 delete p2; //断点 cin.get(); return 0; }
启动任务管理器,查看内存消耗
malloc free
new delete
由于malloc只是给变量p本身分配了内存,但由于不调用构造函数,所以无法让p指向一片分配的内存。同理,free只是释放了变量p,由于并不调用析构函数,所以无法释放p指向的内存。
本专栏目录
所有内容的目录
时间: 2024-10-13 22:29:14