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

来源:互联网 发布:淘宝店铺装修设置单价 编辑:程序博客网 时间:2024/05/19 23:14

本条款将的核心内容就是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;//没问题
是不是很容易用乱。所以尽量能不用就不用。

阅读全文
0 0
原创粉丝点击