c++ - C ++何时调用字符串析构函数
问题描述
假设我有这个设置:
struct My_Struct_T
{
//some stuff
string my_string;
//some other stuff
}
My_Struct_T myVar = {};
string Set_String()
{
string res = "Second String";
return res;
}
void Foo()
{
myVar.my_string = "First String";
//do some stuff
//do i have a memory leak after this line?
myVar.my_string = Set_String();
}
首先 myVar 包含一个指向字符串“First string”的指针(字符串的实际内容当然位于堆上)。
现在,当我调用 set_string() 函数时,我假设我只是在覆盖指针。但是,由于我没有破坏实际的字符串对象,因此没有调用析构函数,因此我遇到了内存泄漏。那是对的吗?:)
解决方案
不它不是。std::string
被设计成在内部处理它的内存——而且是正确的,即它会在需要分配一个新缓冲区的任何时候释放(删除)内部字符串缓冲区。
高效的实现甚至尝试尽可能长时间地重用内部缓冲区(即,分配新内容只会在同一位置覆盖旧的内容,如果它适合的话)。
请注意,分配字符串文字或任何其他 char (const) 指针将导致将分配的数据std::string object
复制到某个内部缓冲区,这尤其意味着它不会获得指针的所有权。如果你new
是一个数组,你会得到内存泄漏,将它分配给 astd::string
并且之后不要delete
......
推荐阅读
- ios - 填充 2 个不同的 PickerView
- nexmo - 通过 Nexmo 发送 SMS 时未发送
- iis - IIS 中 web config 中 ipSecurity 节点中 iPAddress 添加标签的最大数量是多少?
- amazon-web-services - 我有一个指向 s3 存储桶的链接,访问它时会提供包含存储桶内容名称的 XML 文件,我如何下载整个存储桶?
- sql - 列名或提供的值的数量与表定义不匹配。次要错误
- android - 如何从小部件启动活动并在 MainActivity 中处理响应?
- mysql - 如何用新的ID替换重复的ID?
- java - 打包非模块化 JavaFX 应用程序
- android - unity google play 服务和 admob 应用程序在打开时崩溃
- php - Wordpress 在特定页面中隐藏新编辑器