[英]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
成员变量呢?
s
是Class::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.