使用std :: string构造函数复制const char *

时间:2011-01-26 11:42:36

标签: c++ string char std

这段代码好吗?

void SomeClass :: foo(const char * _name) {
     //name is of type const char *
     name = std::string(_name).c_str();
}

看起来它正在工作,但我不确定它是否正常

我应该做一个旧学校strcpy吗?

5 个答案:

答案 0 :(得分:6)

没关系,因为它编译并且不会导致未定义的行为。

确定,因为在语句完成执行后,name指向无效内存。

name = std::string(_name).c_str();

在此语句结束时,临时std :: string被销毁,它释放了c_str()的内存。

  

我应该做一个旧学校strcpy吗?

不,只需将名称更改为std :: string:

void SomeClass :: foo(const char * _name) {
     //name is of type std::string
     name = _name;
}

答案 1 :(得分:3)

之后使用它是不对的 - 一旦临时使用就可以释放内存。为什么不使用字符串作为成员?那你就不必担心内存管理了。

答案 2 :(得分:2)

如果您对name没有做任何事情,那就非常安全。否则,它可能在将来的某个随机点失败。 c_str()成员函数返回的C样式指针仅在临时std::string存在时才有效(并且只要您不改变它,在这种情况下您没有)。一旦封闭的块范围退出,临时就会被销毁,任何name的使用都会让你进入黄昏区域。

正如其他人所建议的那样,您应该将name变成std::string。或者 - 如果你真的需要它来保持char * - 你可以写name = strdup(_name)

答案 3 :(得分:1)

在这种情况下,您将创建一个临时对象并将其指定给指针。离开函数时,此对象将被销毁,指针指向无处。 在你的情况下它可能会工作,因为内存没有被覆盖。但是你应该使用strcpy来避免这个问题。

答案 4 :(得分:0)

我投票给strcpy。为什么简单的事情复杂化?

甚至更好 - 因为您显然需要稍后使用它,为什么不将它转换为std::string并在之后使用它,忘记所有char *