存储字符串文字指针安全吗?

Mir*_*pas 5 c++ static object-lifetime

根据标准:

5.13.5 字符串文字 [lex.string]

16 评估字符串文字会产生具有静态存储持续时间的字符串文字对象,该对象根据上面指定的给定字符进行初始化。未指定所有字符串文字是否不同(即存储在不重叠的对象中)以及字符串文字的连续计算是否产生相同或不同的对象。

和:

6.6.4.1 静态存储持续时间[basic.stc.static]

1 所有没有动态存储持续时间、没有线程存储持续时间、并且不是本地的变量都具有静态存储持续时间。这些实体的存储应在程序持续期间持续

我认为存储指向字符串文字的指针是安全的,例如:

struct Base
{
    Base(const char* name)
        : _name(name)
    {
    }
    
    void print()
    {
        std::cout<<_name<<std::endl;
    }
    
    const char* _name = nullptr;
};

struct MyDerived : public Base
{
    MyDerived () : Base("MyDerived")
    {
    }
};

Run Code Online (Sandbox Code Playgroud)

上面的代码定义清楚了吗?标准中有哪些我必须注意的阴暗角落吗?

Ted*_*gmo 4

上面的代码定义清楚了吗?

是的。

标准中有哪些我必须注意的阴暗角落吗?

也许不是标准中的黑暗角落,但一个问题是你有一个指针,并且允许Base像这样实例化和使用:

Base foo(nullptr);
foo.print();
Run Code Online (Sandbox Code Playgroud)

来自operator<<:“如果是空指针,则行为未定义s。 ”

一个更安全的构造函数:

template<size_t N>
constexpr Base(const char(&name)[N]) : _name(name) {}
Run Code Online (Sandbox Code Playgroud)

我说一些是因为你仍然可以这样做:

auto Foo() {
    const char scoped[] = "Fragile";
    Base foo(scoped);
    foo.print();     // OK
    return foo;
}                    // "scoped" goes out of scope, "_name" is now dangling

int main() {
    auto f = Foo();
    f.print();       // UB
}
Run Code Online (Sandbox Code Playgroud)