std::string如何保持超出作用域的内存而不发生泄漏
How does std::string keep memory beyond scope without a leak?
我的问题是关于以下简单的代码:
#include <iostream>
using namespace std;
const char* call()
{
string str("Hey there.");
return str.c_str();
}
int main()
{
const char* blah = call();
cout << blah << endl;
system("pause");
return 0;
}
输出:"嘿。"
现在,当std::string在方法结束时被销毁时,保存"Hey there."的内存如何不被销毁或导致内存泄漏?我不是c++专家,但我相信如果字符串在堆栈上分配内存保存"Hey there.",当字符串超出作用域(方法结束)时,它将被删除,如果字符串在堆上分配内存来存储"Hey there.",那么这将导致内存泄漏,因为它显然没有破坏内存,因为我们是在字符串超出作用域后访问内存。
那么,我如何能够访问由c_str()指向的内存块而不会导致内存泄漏?
感谢您的回复。
我相信你的字符串在技术上超出了范围,但它不会立即从内存中"删除"。它需要被覆盖。当变量超出作用域时,机器不保证它仍然有效,但偶然地,它可以。当您取消引用指针时,有机会旧的字符串信息仍然存在于内存中的那个位置。此外,术语"内存泄漏"仅为使用关键字new
的内存动态分配保留,用于当您丢失指向该数据的最后一个指针时,这意味着您已经失去了对该数据的访问权限。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏