"最重要的Const"再次

时间:2014-05-29 08:56:16

标签: c++ g++ const rule

再一次来到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进行编译也没有给我任何错误。那么这个例子也显示了长期的临时行为,或者我在这里很幸运?

3 个答案:

答案 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或类似工具轻松检测到此错误。