繁体   English   中英

字符串是否动态分配?

[英]Is string dynamically allocated?

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

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

}

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

c存储"something"func1()完成?

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


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

sClass::func1 std::string类型的局部变量。 一旦func1()完成,字符串s将超出范围。

你有地址的指针s存储在其中将成为悬摆指针。

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

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

c = strdup( c.c_str() );

并且不要忘记在~Class1() free(c) ~Class1()

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM