条款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
- 条款16:成对使用new和delete的时候要采取相同形式
- 条款16:成对使用new和delete时要采取相同的形式
- 条款16:成对使用new和delete时要采取相同的形式
- 条款16:成对使用new和delete时要采取相同形式
- Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
- 《Effective C++》学习笔记条款16 成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- Effective C++:条款16:成对使用new和delete时要采取相同形式
- Effective C++ 读书笔记 条款16:成对使用new和delete时要采取相同形式
- 条款16 成对使用new和delete时要采取相同形式
- Effective C++条款16解读:成对使用new和delete时要采取相同形式
- Effective C++条款16:成对使用new和delete时要采取相同形式
- 条款16 成对使用new和delete时要采取相同形式
- 《Effect C++》学习------条款16:成对使用new和delete时要采取相同形式
- 读书笔记《Effective C++》条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- Effective C++——》条款16:成对使用new和delete时要采取相同的形式
- eclipse屏蔽xml文件报错
- 如何创建ramdisk
- f5禁止
- 匿名内部类 通过接口来实现
- nodeJS
- 条款16:成对使用new和delete的时候要采取相同形式
- linux文件操作
- 董宁:将区块链技术用于民生,才能发挥更大价值
- vue项目开发实战(三)——vue-router
- 图像卷积与滤波的一些知识点
- Leetcode 题解
- opencv_tutorial_code学习——图片叠加
- php使用curl发送post请求
- 微信分享到朋友或朋友圈