全局局部new_delete_malloc_free的调用过程分析

本文探讨了C++中不同层面的内存管理方式,包括C语言层的malloc/free与C++层的new/delete操作符,并通过一个具体例子展示了这些操作的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
VS2013:
 注意时应该把 把debug 模式换成 releasr 模式下运行,否则会冲突,因为都对内存进行管理。

 C++ C语言层 管理内存的区别
 C语言层管理内存,管理malloc free
 全局 new 局部 new ,都会调用一次构造函数
 管理内存即调用局部,又调用全局管理
 局部的内内存管理是管理对象的,全局的内存管理是管理基本数据类型 int double...
 局部new ->全局new ->malloc ->构造函数  也可以跳过全局new  //局部new -> malloc->构造函数
 //构造->局部delete ->全局delete ->free
*/
#include<iostream>
#include<cstdlib> //malloc free
using namespace std;
void * mymalloc(size_t size)
{
	cout << "mymalloc" << endl;
	void *p = malloc(size);
	return p;
}

void myfree(void *p)
{
	cout << "myfree" << endl;
	free(p);
}

#define malloc mymalloc
#define free myfree



//重写全局可以监视所有。

void * operator new(size_t size)
{
	cout << "g_all new " << endl;
	void *p = (void *)malloc(size);
	return p;
	//return nullptr;
}
void operator delete(void *p)
{
	cout <<"g_all delete" << endl;
	free(p);
}

//new 无论是局部还是全局都会调用一次构造函数。
class myclass
{
public:
	myclass()
	{
		cout << "myclass()" << endl;
	}
	~myclass()
	{
		cout << "~myclass()" << endl;
	}
	/* 重写了 new delete */
	 void * operator new(size_t size)
	{
		 cout << "myclass new" << endl;
		 //局部new ->全局new ->malloc ->构造函数
		 myclass *p = ::new myclass;
		 return p;

		 //局部new -> malloc->构造函数
		/* void *p = malloc(size);
		 return p;*/
		
	}
	 void operator delete(void *p)
	{
		 cout << "myclass delete" << endl;
		//构造->局部delete ->全局delete ->free
		 //::delete p;

		 //构造->局部delete ->free
		 free(p);
	}


};

void main()
{
	/*int *p1 = new int(5);
	int *p2 = new int[5]{1, 2, 3, 4, 5};*/
	//new delete  本质是函数,C++标准库函数。
	//调用局部的 
	myclass *p = new myclass;
	delete p;

	//调用全局的。
	//myclass *p = ::new myclass;
	//::delete p;

	cin.get();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值