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,但我对此很好奇.
任何指针或帮助,一如既往,非常感谢:)谢谢.
字符串文字将由编译器放置在二进制文件的初始化数据或文本(代码)段中,而不是驻留在(运行时分配的)内存或堆栈中.因此,您应该使用指针,因为您将引用编译器已为您生成的字符串文字.请注意,修改此(通常需要更改内存保护)将更改此文字的所有用法.
修改字符串文字是未定义的行为,并且很可能是程序崩溃的原因(ISO C++:2.13.4/2).该标准允许从字符串文字转换char*为向后兼容到C,如果您绝对需要,您应该只在代码中进行转换.
如果您希望将字符串文字视为常量,则可以将成员的类型更改为a const char *.
如果您的设计要求s可以修改,那么我建议将其类型更改为std::string.