我今天遇到了这段代码:
KeepaliveThread::KeepaliveThread(VideoDevice *device)
: Thread()
{
...
startup_lock = new Mutex("KeepaliveThread::startup_lock");
}
Mutex::Mutex(const char *title, int recursive)
{
this->title = title;
...
}
这个>标题的用法是否安全?据推测" KeepaliveThread :: startup_lock"是一个静态的记忆区域,因此从该位置读取总是安全的。
你认为这是可接受的还是不好的做法?
答案 0 :(得分:1)
来自 [lex.string]
普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n
const char
”数组,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
如果我们转到3.7 [basic.stc] ,具体来自 [basic.stc.static] ,我们有
所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间(3.6.2,3.6.3)。
因此,您的字符串文字在程序的持续时间内具有静态存储持续时间和存储持续时间,因此将const char*
存储到字符串文字是安全的
请注意,即使编译器允许您向其存储char*
,任何修改字符串文字的尝试都是未定义的行为。