条款16:成对使用new和delete的时候要采取相同形式

本条款将的核心内容就是new和delete搭配,new []和delete[]搭配。不要混合乱用。

下面我们来解释为什么

1.首先来看new和delete

记住:new/delete是C++中的关键字不是函数,下面我们来看看他们背后的机制为什么比malloc使用起来简单了很多呢。

(下面的例子用自定义类型说明,自定义类型最后在说)

首先来说new,看如下代码

class test
{
private:
	int _a;
public:
	test()
	{
		cout << "test::构造函数" << endl;
		_a = 10;
	}
	~test()
	{
		cout << "test::析构函数" << endl;
	}
};
int main()
{
	test *p = new test;
	delete  p;;
	system("pause");
	return 0;
}

在这里我们使用了

test *p = new test;
	delete  p;;
这里的new和delete是如何工作的呢?

在来看看如下代码

下面来看看new[]和delete []

test *p = new test[5];
	delete [] p;


现在对于为什么不能随便混搭有了一定的了解了吧。

下面我来解释吧

对于自定义类型:

1.用了new ,用delete [],系统首先会当成一个数组来处理,对此调用析构函数,然后给operator传过去的地址--,这些错误是不是很荒唐,不崩溃才怪。

2.用了new [],用 delete,这样的话编译器会把数组当成一个对象来处理,直接调用一次析构函数,然后处理一块不完整的空间,这是不是也很荒唐,产生未定义行为,程序可能走一半卡住了。如果你给指针--然后去释放,这样虽然可以,通过,但是会造成内存泄漏。

所以说不要混用

最后还有一点,对于喜欢用typedef 定义数组类型的的人的忠告,尽量不要用typedef 来定义数组。。为什么呢?看下面的代码

typedef std::string arr[4];//arr代表string[4]
	std::string *p = new arr;//相当于new string[4]
	delete p;//未定义行为
	delete[] p;//没问题
是不是很容易用乱。所以尽量能不用就不用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值