再一次来到Herb Sutter的THIS帖子,我开始思考为什么不应该同样适用于const指针。
这是测试代码
const char* get()
{
std::string a("something");
return a.substr(1, a.size() - 3).c_str();
}
int main()
{
const char* str = get();
std::cout << str << std::endl;
return 0;
}
std string的substr
返回一个新的字符串对象。使用g++ -Wall
进行编译也没有给我任何错误。那么这个例子也显示了长期的临时行为,或者我在这里很幸运?
答案 0 :(得分:2)
规则规定:
“临时绑定到 const引用的生命周期延长到const的生命周期。”
您的代码示例&amp;中没有使用引用。它与GOTW代码示例无关。您的代码只是为您提供未定义的行为。根据你的看法,你可能会认为自己很幸运/不幸,它有效。
重要提示: 引用不是指针!!
答案 1 :(得分:0)
不,指向const
的指针不会延长临时的生命周期。
只有将临时文件绑定到引用到const
时,才会将生命周期延长到参考文件本身的生命周期。
{
Foo factory();
const Foo& fooRef = factory();
const Foo* fooPtr = &factory();
fooRef.doSomething(); // OK
fooPtr.doSomething(); // UB, dangling pointer.
}
答案 2 :(得分:0)
你可以想象,std :: string很简单:
class string {
const char *str_;
string(const char *str) {
str_ = new char[strlen(str)];
strcpy(str_, str);
}
~string() {
delete[] str;
}
const char *c_str() {
return str_;
}
}
所以,从get()返回后,字符串将被销毁,你将有一个指向垃圾的指针。您可以使用valgrind或类似工具轻松检测到此错误。