c++ - std::string 如何在不泄漏的情况下保持内存超出范围?

标签 c++

<分区>

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

#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 在方法结束时被销毁时,不会被销毁或导致内存泄漏?我不是 C++ 专家,但我相信字符串是否分配了包含“Hey there”的内存。在堆栈上,当字符串超出范围(方法结束)时,它会被删除,如果字符串在堆上分配内存来存储“Hey there”。那么这将导致内存泄漏,因为它显然不会破坏内存,因为我们在字符串超出范围后访问内存。

那么,我如何能够访问 c_str() 指向的内存块而不导致内存泄漏?

非常感谢您的回复。

最佳答案

我相信您的字符串在技术上超出了范围,但它不会立即从内存中“删除”。它需要被覆盖。当一个变量超出范围时,机器不保证它仍然有效,但碰巧它可以。当您取消对指针的引用时,有可能旧的字符串信息仍然存在于内存中的那个位置。此外,术语“内存泄漏”仅保留用于使用关键字 new 动态分配内存,因为当您丢失指向该数据的最后一个指针时,这意味着您无法访问该数据。

关于c++ - std::string 如何在不泄漏的情况下保持内存超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363352/

相关文章:

c++我的二叉树格式正确

c++ - 生命周期短的分配会导致堆碎片吗?

c++ - 在结构中设置数组的值

C++:如何优化标准布局类模板中的空数据成员?

CoW、继承类和可变共享数据的 c++ 设计模式?

c++ - 我们可以通过c++中的运算符重载将一个类的数据转换为另一个类吗?

c++ - 根据对象类调用不同的方法

c++ - MFC 对话框按钮显示为黑框

c++ - 带有 remove_copy_if 的 back_insert_iterator

c++ - 解析定界字符串