我有一个简短的问题。我有以下代码:
class Class1
{
Class1();
~Class1();
void func1();
private:
char* c;
}
void Class1::func1()
{
string s = "something";
this->c = s.c_str();
}
当c
完成时,会"something"
存储func1()
吗?
答案 0 :(得分:8)
否。它将调用未定义的行为。(如果你取消引用指针,无论如何。)由于s
是一个具有自动存储持续时间的块范围对象,它会在函数返回时被销毁,并呈现.c_str()
返回的指针无效。
为什么不使用std::string
成员变量?
答案 1 :(得分:3)
s
是std::string
中Class::func1
类型的本地变量。 func1()
完成后,字符串s
将超出范围。
任何存储在其中的s
地址的指针都将成为悬空指针。
答案 2 :(得分:1)
它将存储您不能访问的悬空指针。它可能包含字符串"something"
,也可能不包含。没关系,因为访问它是未定义的行为,应该完全避免。
如果要复制字符串,请执行以下操作:
c = strdup( c.c_str() );
不要忘记free(c)
~Class1()
请注意,如果您拨打func1
两次,则会泄漏内存。您可能希望在构造函数中初始化c
到NULL
,并在free(c)
重新分配之前调用func1
。
当然,更好的方法是存储std::string
而不是char*
,它会为您正确管理内存。
答案 3 :(得分:1)
一旦控件退出该块,变量s
将超出范围,此时将调用其析构函数。