std::string如何保持超出作用域的内存而不发生泄漏

How does std::string keep memory beyond scope without a leak?

本文关键字:内存 泄漏 作用域 string 何保持 std      更新时间:2023-10-16

我的问题是关于以下简单的代码:

#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的内存动态分配保留,用于当您丢失指向该数据的最后一个指针时,这意味着您已经失去了对该数据的访问权限。