3

我有一个快速的问题。我有以下代码:

class Class1
{
    Class1();
    ~Class1();
    void func1();
private:
    char* c;

}

void Class1::func1()
{
    string s = "something";
    this->c = s.c_str();
}

完成后会c存储吗?"something"func1()

4

4 回答 4

8

不,它将调用未定义的行为。 (无论如何,如果您取消引用指针。)由于s是具有自动存储持续时间的块范围对象,因此它在函数返回时被销毁,并且使返回的指针.c_str()无效。


为什么不使用std::string成员变量呢?

于 2013-10-24T21:42:35.177 回答
3

s是 in 类型的局部std::string变量Class::func1func1()完成后,字符串将s超出范围。

您拥有的任何s存储在其中的地址的指针都将成为悬空指针。

于 2013-10-24T21:42:11.960 回答
1

它将存储一个您不得访问的悬空指针。它可能包含字符串"something",也可能不包含。没关系,因为访问它是未定义的行为,应该完全避免。

如果要复制字符串,请执行以下操作:

c = strdup( c.c_str() );

不要忘记free(c)进入~Class1()

请注意,如果您调用func1两次,则会泄漏内存。您可能希望在构造函数中初始化c为,并在重新分配之前调用.NULLfree(c)func1

当然,更好的方法是存储 astd::string而不是 a char*,它可以为您正确管理内存。

于 2013-10-24T21:42:07.447 回答
1

一旦控制退出该块,变量s, 将超出范围,此时将调用其析构函数。

什么时候对象“超出范围”?

于 2013-10-24T21:43:17.200 回答