关闭

new/delete和new[]/delete[]的底层调用和简单实现

标签: newdelete定位new表达式
812人阅读 评论(0) 收藏 举报
分类:
在使用new的时候做了两件事:
1、调用operator new分配空间
2、调用构造函数初始化对象

在使用delete的时候也做了两件事:
1、调用析构函数清理对象
2、调用operator delete函数释放空间

在使用new[N]的时候也做了两件事:
1、调用operator new分配空间
2、调用N次构造函数初始化N个对象

在使用delete[]的时候也做了两件事:
1、调用N次析构函数清理N个对象
2、调用operator delete函数释放空间




定位new表达式:定位new表达式是在以分配的原始空间中调用构造函数初始化一个对象。
new(place_address) type;
new(place_address) type(initializer-list);
place_address必须是一个指针,initializer-list是初始化列表

利用mallco/free和定位new表达式来模拟new/delete和new[]/delete[]:
例:
class A
{
public:
	A(int a=2)
		:_a(a)
	{
		cout << "A()"<< endl;
	}
	void Show()
	{
		cout << _a << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};


void test()
{
	//分配1个A类型空间
	A *pa = (A *)malloc(sizeof(A));
	new(pa)A(1);   //调用构造函数
	pa->~A();      //调用析构函数
	free(pa);

	//分配10个A类型的空间
	A* pa = (A *)malloc(sizeof(A)*10);
	for (int i = 0; i < 10; i++)       //调用十次构造函数
	{
		new(pa + i) A(i);
	}
	for (int i = 0; i < 10; i++)       //调用十次析构函数
	{
		(pa + i)->~A();
	}
	free(pa);
}



1
1
查看评论

c++详解【new和delete】

说起new和delete,了解过c++的人应该都知道吧,它是用来分配内存和释放内存的两个操作符。与c语言中的malloc和free类似。 c语言中使用malloc/calloc/realloc/free进行动态内存分配,malloc/calloc/realloc用来在堆上分配空间,free将申请的...
  • xxpresent
  • xxpresent
  • 2016-11-21 09:22
  • 1674

new/delete和new[ ]/delete[ ]的底层调用和简单实现

在使用new的时候做了两件事: 1、调用operator new分配空间 2、调用构造函数初始化对象 在使用delete的时候也做了两件事: 1、调用析构函数清理对象 2、调用operator delete函数释放空间 在使用new[N]的时候也做了...
  • sinat_34967445
  • sinat_34967445
  • 2017-08-18 10:12
  • 59

c++ new delete new[] delete[] 底层实现

关于delete和delete[]的相关实现。
  • cFarmerReally
  • cFarmerReally
  • 2017-01-17 18:01
  • 469

重载new和delete的一些规则

重载new和delete的一些规则重载new和delete的一些规则 一般规则 特殊规则1 特殊规则2 特殊规则3 new和delete重载实例 直接获取当前的new_handler 转载请注明出处参考:《Effective C++》一般规则1.内存分配失败时调用new_handler 关于new...
  • sanoseiichirou
  • sanoseiichirou
  • 2015-11-20 23:18
  • 1317

new/delete与new[]/delete[]实现机制

new和delete是C++新引入的单目运算符,它们可以从堆上分配和删除存储块(堆在C++中也叫自由存储).用new运算符(不是函数)时要指明数据类型,以后new就分配一个足以放下指明类型对象的存储,并返回该存储块的首地址作为指向指定类型的指针. 1. new/new[]:完成两件事,先底层调用m...
  • weizhengbo
  • weizhengbo
  • 2017-02-18 21:48
  • 534

【C++】 深入探究 new 和 delete

在C++中,我们应该经常会用到new、delete,它们是C++的一个关键字,同时也是一个操作符,下面我将我对这两者的了解和学习做一个总结和探讨。new和delete的全过程首先我们定义一个对象A: struct A { size_t h; };当我们使用关键字new在...
  • codedoctor
  • codedoctor
  • 2017-07-27 14:29
  • 627

new/delete 详解

new 和 delete 是 C++ 用于管理 <font color=ff00ff>堆内存</font> 的两个运算符,对应于C语言中的 malloc 和 free,但是malloc和free是函数,new 和 delete 是运算符。
  • hihozoo
  • hihozoo
  • 2016-05-18 14:31
  • 7056

malloc/free与new/delete异同点

malloc/free与new/delete异同点 相同点malloc/free与new/delete都可以用于申请动态内存和释放内存,他们申请的空间都在堆上分配。 不同点1)操作对象不同malloc/free是C++/C语言的标准库文件,new/delete是C++的运算符;对非内部数据对象,ma...
  • yzhang6_10
  • yzhang6_10
  • 2016-04-12 18:33
  • 477

new/delete 和new[]/delete[]的解读(转)

 new 和 delete 到底是什么? 如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以...
  • qq_32744005
  • qq_32744005
  • 2016-07-26 01:25
  • 674

C++ 中的 new/delete 和 new[]/delete[]深入理解

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new...
  • zyazky
  • zyazky
  • 2016-09-22 22:24
  • 923
    博客专栏
    文章分类
    最新评论