问:
在下面的代码中,我在一个地方(标记为ONE)将一个String literals赋值给类的一个私有域,并且在将来的某个时刻访问它(标记为TWO)。在这种情况下,代码会引用一个dangling指针吗?因为这段代码非常短可能还不足以暴露问题?
#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;
}
我应该将变量”s”声明为一个字符数组而不是一个指针吗?我本打算使用std::string,但是我只是好奇。
答:
编译器在编译代码时,将会把String literals存储到二进制文件的initialized data或text(code)段中,而不是位于堆或堆栈中。因此你可以使用这个指针,但是注意不要修改String literals,如果你那样做了可能会导致程序崩溃,因为修改String literals会导致未定义的行为(ISO C++: 2.13.4 /2)。为了向后兼容C,标准允许将一个String literals强制转换为一个char*,因此如果你确实需要,可以执行转换。
如果你希望将String literals视为一个常量,那么你应该将成员类型声明为const char*。
后记:
Stackoverflow是一个针对开发者的协作式可编辑的Q&A网站。
int s = sizeof('a'); //在这里s equals Four!