这段代码好吗?
void SomeClass :: foo(const char * _name) {
//name is of type const char *
name = std::string(_name).c_str();
}
看起来它正在工作,但我不确定它是否正常
我应该做一个旧学校strcpy吗?
答案 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 *
?