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