小心指针被delete两次 情况如下试例 ! ———【Badboy】
来源:互联网 发布:淘宝心等级查询 编辑:程序博客网 时间:2024/04/29 23:42
小心指针被delete两次
C++类中,有时候使用到传值调用(对象实体做参数),遇到这种情况,可要小心了!特别是当你所传值的对象生命周期较长,而非临时对象(生命周期段)的时候。来看看下面的情况:
#include
using namespace std;
class Text
{
private:
char * str;
public:
Text(){str = new char[20];::memset(str,0,20);}
void SetText(char * str)
{
strcpy(this->str,str);
}
char * GetText() const{return str;}
~Text()
{
cout 《 "~Text Destruction" 《 endl;
delete [] str;
cout 《 "~Text Over" 《 endl;
}
};
void Print(Text str)
{
cout 《 str.GetText() 《 endl;
}
int main()
{
Text t;
t.SetText("abc");
Print(t);
return 1;
}
上面执行的结果程序崩溃了。原因:
Print(Text str)在对str进行复制构造的时候,没有进行深度拷贝;当 Print退出的时候,因为是临时对象(函数初始时构造),对str进行析构,此时还没有任何破绽;但回到main,继而退出main 的时候,又对t进行析构,但此时t内的str中的内容已经被销毁。由于对一内存空间实施了两次销毁,于是出现内存出错。
解决方法:
重写浅拷贝。像一下版本,不同的情况要作出适当的调整:
#include
using namespace std;
class Text
{
private:
char * str;
public:
Text(){str = new char[20];::memset(str,0,20);}
Text(Text &t)
{
str = new char[20];
strcpy(str,t.GetText());
}
void SetText(char * str)
{
strcpy(this->str,str);
}
char * GetText() const{return str;}
~Text()
{
cout 《 "~Text Destruction" 《 endl;
delete [] str;
cout 《 "~Text Over" 《 endl;
}
};
void Print(Text str)
{
cout 《 str.GetText() 《 endl;
}
int main()
{
Text t;
t.SetText("abc");
Print(t);
return 1;
}
(推荐)不使用传值调用。就像下面书写如下Print版本:
void Print(Text &str)
{
cout 《 str.GetText() 《 endl;
}
除非对象内所有的成员读属非指针内存内容,那么谨慎使用文章前面的用法。
‘小子献上 望懂的朋友给个关注 顶下 谢谢 感激不尽 写得有点幸苦哟
- 小心指针被delete两次 情况如下试例 ! ———【Badboy】
- C/C++ 使用delete删除指针需小心 “野指针”
- C++指针编程你要小心的陷阱——如何优雅的释放指针void*
- C++指针编程你要小心的陷阱——如何优雅的释放指针void*
- C++指针编程你要小心的陷阱——如何优雅的释放指针void*
- 两次free()或delete()同一个指针地址会怎么样。
- 什么是“恶意代码”——————【Badboy】
- 一组超级黄色笑话——————【Badboy】
- 恶作剧!电脑关机脚本代码————【Badboy】
- [转]被拒绝的情况如下
- rn——小心得
- 小心小心再小心!!!——误操作删除rac一节点的安装目录
- C++ 指针 new delete 赋值各种情况总结
- Makefile条件判断 ——————————【Badboy】
- 浮生若梦,不诉离殇————————【Badboy】
- 关于百度蜘蛛IP详解————————【Badboy】
- 教你看透自己电脑————————【Badboy】
- C语言的一些特殊用法————————【Badboy】
- 利用PHP SOAP实现WEB SERVICE
- 屌丝如何成功逆袭?
- CSS 中文字体对应英文和Unicode编码
- php做推送服务端实现android消息推送
- 带你了解BOM
- 小心指针被delete两次 情况如下试例 ! ———【Badboy】
- 2014年8月编程语言排行
- Tab bar和UINavigationController同时使用
- 支持云南
- 游戏开发---因为爱,所以爱
- hdu 3635 Dragon Balls
- LruCache之Android瀑布流照片墙实现,体验不规则排列的美感
- unity开发android游戏(三)用Unity Remote.apk调试
- 编程之美--分层遍历二叉树