博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《从缺陷中学习C/C++》——6.17 String对象何时需delete
阅读量:6332 次
发布时间:2019-06-22

本文共 1165 字,大约阅读时间需要 3 分钟。

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.17节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.17 String对象何时需delete

从缺陷中学习C/C++

代码示例

int main(){ string str1("stack-allocated str1"); string str2 = "stack-allocated str2"; string* str3 = new string("heap-allocated str3"); return 0;}

现象&后果

程序在运行时发生内存泄露。

Bug分析

程序中使用了string对象的不同初始化或生成方式,容易让人迷惑,先解释一下。

图像说明文字 str1是string对象的显式初始化,调用string类的构造函数string ( const char * s )初始化。

图像说明文字 str2是复制初始化,会首先生成一个临时string对象,该临时对象以所赋值字符串为输入,调用string ( const char * s )构造函数生成。然后以该临时对象的引用为参数调用string类的复制构造函数初始化str2。因为str1和str2对象都是在main函数体内声明的,所以都是分配在栈上。

图像说明文字 str3是一个string对象指针,指向一个由new操作符生成的string对象。由于是由new生成的,所以该对象分配于堆上。

上述代码混淆了string对象的用法,不知道该什么时候调用delete释放对象。C++中没有垃圾回收机制,申请动态内存空间后,使用完后必须释放掉,否则会引起内存泄露。

那什么时候必须自己显式调用delete语句呢? 答案是,如果对象是在栈上分配的,不需要人工处理,当超出对象作用范围时,该对象的析构函数会自动被调用以释放该对象;如果对象是使用new操作符在堆上分配的,则必须使用delete操作符释放该对象。

上面代码中str1和str2都是在栈上分配的局部变量,所以,会在程序退出main函数前被自动析构。而str3是由new操作符在堆上分配的,必须使用delete操作符来释放。

正确代码

int main(){ string str1("stack-allocated str1"); string str2 = "stack-allocated str2"; string* str3 = new string("heap-allocated str3"); delete str3; return 0;}```  本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
你可能感兴趣的文章
给定一个字符串s,返回去掉子串"mi"后的字符串。
查看>>
Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
查看>>
Wrod中超链接的一些技巧
查看>>
我的友情链接
查看>>
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片***
查看>>
Codeforces Round #256 (Div. 2) D. Multiplication Table 【二分】
查看>>
ARM汇编指令格式
查看>>
HDU-2044-一只小蜜蜂
查看>>
HDU-1394-Minimum Inversion Number
查看>>
df -h 卡住
查看>>
第七天1
查看>>
[转] createObjectURL方法 实现本地图片预览
查看>>
Jquery中的Jquery.extend, Jquery.fn.extend,Jquery.prototype
查看>>
JavaScript—DOM编程核心.
查看>>
JavaScript碎片
查看>>
Bootstrap-下拉菜单
查看>>
soapUi 接口测试
查看>>
【c学习-12】
查看>>
工作中MySql的了解到的小技巧
查看>>
loadrunner-2-12日志解析
查看>>