指针成员变量需要初始化为nullptr吗?
2016-07-14 22:28
411 查看
今天的博客是与大家一起讨论一个问题,共同学习进步。
上一篇博客用了很多代码段,演示了各种的情况下的内存泄露。
今天在实际工程中又遇到了指针带来的错误,分君分享。
描述:
有一个类A:
有一个类B:
就是上面的代码,被我简化了,一句话概括就是,在B类中使用了A类的指针对象作为的成员变量。
感觉没啥问题吗?
该有的析构函数都有啊。。。
但是问题来了,如果 start()函数没执行怎么办?
你可能会这样认为,如果start()没执行,也就没有给指针a分配内存,所以a为空,当然就不会执行delete a操作了。
但是实际情况不是你想象的这个样子的,我们不能保证a = nullptr,也许是一个垃圾值。
那么,有一个简单的解决方法,就是在给a分配内存之前,先把a赋值为nullptr。
使用初始化列表
在构造函数的时候对a进行赋值:
接下来是一个大神对我的指点:
在if中不要直接判断a
因为a可以是0,NULL, nullptr,只有C++11才支持nullptr。
而且上面的写法对于平台的移植很不方便。
应改为:
最后与君分享:
上一篇博客用了很多代码段,演示了各种的情况下的内存泄露。
今天在实际工程中又遇到了指针带来的错误,分君分享。
描述:
有一个类A:
class A { public: A(){} ~A(){} void show(){std::cout << "show" << std::endl;} }
有一个类B:
class B { public: B(); ~B(); public: void start(); private: A * a; } B::B() { } B::~B() { if(a) { delete a; a = nullptr; } } B::start() { a = new a(); }
就是上面的代码,被我简化了,一句话概括就是,在B类中使用了A类的指针对象作为的成员变量。
感觉没啥问题吗?
该有的析构函数都有啊。。。
但是问题来了,如果 start()函数没执行怎么办?
你可能会这样认为,如果start()没执行,也就没有给指针a分配内存,所以a为空,当然就不会执行delete a操作了。
但是实际情况不是你想象的这个样子的,我们不能保证a = nullptr,也许是一个垃圾值。
那么,有一个简单的解决方法,就是在给a分配内存之前,先把a赋值为nullptr。
使用初始化列表
在构造函数的时候对a进行赋值:
B::B() : a(nullptr) { }
接下来是一个大神对我的指点:
在if中不要直接判断a
因为a可以是0,NULL, nullptr,只有C++11才支持nullptr。
而且上面的写法对于平台的移植很不方便。
应改为:
B::~B() { if(a != nullptr) { delete a; a = nullptr; } }
最后与君分享:
#include<iostream> class Test { public: Test() {} ~Test() {} public: void Show() { std::cout << "show" << std::endl; } }; int main() { Test* test; std::cout << test; //错误了,VS会告诉你使用了未初始化的变量 test = nullptr; test = new Test(); test->Show(); if (test != nullptr) { delete test; test = nullptr; } system("pause"); }
相关文章推荐
- Linux学习笔记--搜索命令
- Code[vs]3287【NOIP2013提高组】【7.13考试第四题】货车运输
- 343. Integer Break
- ul li 实例
- WebRTC编译篇之Ninja 编译系统 二
- kali搜集工具之CDPSnarf
- UVA 573 The Snail
- Javascript数组学习
- java静态方法中不能引用非静态变量
- 统计学习方法----条件随机场3
- 326. Power of Three
- struts2 国际化
- C++之多态
- [2016/7/14]一天不写东西就难受
- 原型对象 原型相关问题
- 【JZOJ 4599】西行妖
- LeetCode - 12. Integer to Roman
- Codeforces Round #361 (Div. 2)
- android中EventBus总线框架的使用
- CDP协议