C++拾遗--malloc free与new delete的同与不同

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-12-18 22:15:33

C++拾遗--malloc free与new delete的同与不同的相关文章

比较malloc/free和new/delete

比较malloc/free和new/delete ??涉及到内存分配时,经常用到malloc与free.malloc与free是C++/C的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. ??对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于 malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加

malloc/free与new/delete的区别

相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数.由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free. (2)用法上也有所不同.函数malloc 的原

malloc/free和new/delete的区别汇总

一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void* FirstByte):该函数是将之前用malloc分配的空间还给程序或者操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回,指向被分配的内

malloc free 和new delete区别

从网上看的学习之 1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+"."-"."*"."/"有一样的地位. 2. new/delete是可以重载的,而重载之后,就成为了函数. 3. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型. 4. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存

malloc/free、new/delete 区别

1. Malloc:malloc/free是C++和C的标准库函数,可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用 malloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是 库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 2. New:new/delete是C++的运算符.可用于申请动态内存和释放内存.C++语言需要一个能完成动

百度笔试题:malloc/free与new/delete的区别(转)

百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和delete是C++的运算符.对于非内部数据类的对象而言,光用malloc/free 无法满足动态对象的要求.对象在创建时要自动执行构造函数,对象消亡之前要自动执行析构函数,malloc和free是库函数而不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/f

malloc/free 与 new/delete的区别和联系

一.基本概念  malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被

malloc/free和new/delete的异同

一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分

malloc/free 和 new/delete

一.Malloc/free 1.Malloc的原型:(#include <malloc.h>) Void * malloc(size_t size);   //  Void * malloc(unsigned int num_bytes); 如果分配失败,则返回NULL,否则返回申请内存的首地址.malloc本身并不识别要申请内存的类型(返回类型为void *),只关心内存的字节数,因此必须显式的进行类型转化. 2.Free的原型: Void free(void *memblock); 如果f