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;
}

调试

malloc free与new delete的同与不同

malloc free与new delete的同与不同

malloc free与new delete的同与不同

同样的功能使用new和delete来操作

#include <iostream>
using namespace std;
int main()
{
 int *p = new int[10];
 cout << p << endl;
<span> </span>//断点
 for (int i = 0; i < 10; i++)
  p[i] = i;
<span> </span>//断点
 delete[]p;
<span> </span>//断点
 cin.get();
 return 0;
}

调式

malloc free与new delete的同与不同

malloc free与new delete的同与不同

malloc free与new delete的同与不同

对于内置类型,两组操作的效果是一样的。

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指向的内存。

------------------------------分割线------------------------------

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

C语言梳理一下,分布在以下10个章节中:

Linux-C成长之路(一):Linux下C编程概要

Linux-C成长之路(二):基本数据类型

Linux-C成长之路(三):基本IO函数操作

Linux-C成长之路(四):运算符

Linux-C成长之路(五):控制流

Linux-C成长之路(六):函数要义

Linux-C成长之路(七):数组与指针

Linux-C成长之路(八):存储类,动态内存

Linux-C成长之路(九):复合数据类型

Linux-C成长之路(十):其他高级议题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6e573cf98d060f83f23e5f88cd536ee5.html