函数内的字符串文字:自动变量还是在堆中分配?

Sri*_*nth 3 c c++ memory memory-leaks memory-management

我们在里面使用的字符串文字是自动变量吗?或者它们是否已在堆中分配,我们必须手动释放?

我的情况类似于下面显示的代码,其中我将字符串文字分配给类的私有字段(在代码中标记为ONE),并在稍后的程序中检索它并使用它(标记为TWO).我是否将堆栈中的变量分配给ONE中的字段?代码是否可以引用悬空指针,在这种情况下,因为程序足够小,所以可以工作?

我编译并运行它,它运行正常,但我在我的实际程序中遇到了一个奇怪的崩溃,我将字符串文字分配给类的字段,我怀疑上面提到的情况.

#include <iostream>

using namespace std;

class MemoryLeak
{
private:
    char *s;
public:
    MemoryLeak() {}

    void store()
    {
        s = "Storing a string"; // ONE
    }

    char *retrieve()
    {
        return s;
    }
};

int main()
{
    MemoryLeak *obj = new MemoryLeak();
    obj->store();
    cout << obj->retrieve() << endl; // TWO
    delete obj;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我应该将变量"s"声明为char数组而不是指针吗?我打算使用std :: string,但我对此很好奇.

任何指针或帮助,一如既往,非常感谢:)谢谢.

Cod*_*ous 9

字符串文字将由编译器放置在二进制文件的初始化数据或文本(代码)段中,而不是驻留在(运行时分配的)内存或堆栈中.因此,您应该使用指针,因为您将引用编译器已为您生成的字符串文字.请注意,修改此(通常需要更改内存保护)将更改此文字的所有用法.

  • 修改它是非法的.它真的是一个常见问题*. (2认同)

Ric*_*den 6

修改字符串文字是未定义的行为,并且很可能是程序崩溃的原因(ISO C++:2.13.4/2).该标准允许从字符串文字转换char*为向后兼容到C,如果您绝对需要,您应该只在代码中进行转换.

如果您希望将字符串文字视为常量,则可以将成员的类型更改为a const char *.

如果您的设计要求s可以修改,那么我建议将其类型更改为std::string.