字符串是否动态分配?

时间:2013-10-24 21:40:32

标签: c++ string

我有一个简短的问题。我有以下代码:

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

}

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

"something"存储func1()吗?

4 个答案:

答案 0 :(得分:8)

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


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

答案 1 :(得分:3)

sstd::stringClass::func1类型的本地变量。 func1()完成后,字符串s将超出范围。

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

答案 2 :(得分:1)

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

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

c = strdup( c.c_str() );

不要忘记free(c)

中的~Class1()

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

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

答案 3 :(得分:1)

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

When is an object "out of scope"?