C++ 中使用 new/delete 和 new[]/delete[]

一、概述

在使用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函数释放空间

二、几个相关问题

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?

  1. new 和 delete 是函数吗?
  2. new [] 和 delete [] 又是什么?什么时候用它们?
  3. 你知道 operator new 和 operator delete 吗?
  4. 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?

具体内容和内部分析请参考:https://blog.csdn.net/hazir/article/details/21413833

问:什么情况下new[]出来的数组可以使用delete释放?

// String 的析构函数
String::~String(void)
{
	delete [] m_data;
	// 由于m_data 是内部数据类型,也可以写成 delete m_data;
}
// String 的普通构造函数
String::String(const char *str)
{
	if(str==NULL)
	{
		m_data = new char[1];
		*m_data = ‘\0;
	}
	else
	{
		int length = strlen(str);
		m_data = new char[length+1];
		strcpy(m_data, str);
	}
}

上面析构函数内delete m_data不是只释放一个单元么?

不是, 对于 char, int, float…等等内部数据类型, delete 和 delete[] 一样,但对于类就大有不同。

比如 char* p = new char[128]; delete p; 和 delete[] p; 效果一样,p的所有内存都释放了。

delete 和 delete[] 的不同之处在对class 的释放, delete只会调用一个元素的析构函数,而delete[]则调用所有元素的析构。

比如

class t 
{ 
	~t() {}; 
}; 

t* p = new t[128]; 

delete p;delete[] p

内部都会调用operator delete()释放p的所有(128个)元素, 但 delete是调用了第一个元素的析构, 而delete[] 则是正确的调用128个元素的析构。

总的来说,记住一点即可:new/delete、new[]/delete[] 要配套使用总是没错的!

参考资料:
http://blog.51cto.com/11142019/1846844
https://blog.csdn.net/hazir/article/details/21413833
http://www.myexception.org/cpp/556220.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值