【发布时间】:2015-12-28 14:46:19
【问题描述】:
编辑:重复标记中的链接问题已回答了有关此问题中的代码为何起作用的问题。关于字符串字面量寿命的问题在这个问题的答案中得到了解答。
我试图了解const char * 指向的字符串如何以及何时被释放。
考虑:
const char **p = nullptr;
{
const char *t = "test";
p = &t;
}
cout << *p;
离开内部作用域后,我希望p 成为指向const char * 的悬空指针。但是在我的测试中它不是。这意味着即使在 t 超出范围之后,t 的值实际上仍然有效且可访问。
这可能是由于通过将其绑定到 const 引用来延长临时的生命周期。但是我没有这样做,即使将t 的引用保存在成员变量中并稍后从不同的函数中打印该值,仍然可以为我提供正确的值。
class CStringTest
{
public:
void test1()
{
const char *t = "test";
m_P = &t;
test2();
}
void test2()
{
cout << *m_P;
}
private:
const char **m_P = nullptr;
};
那么这里t 的值的生命周期是多少?我会说我通过取消引用指向超出范围的变量值的指针来调用未定义的行为。但它每次都有效,所以我认为情况并非如此。
尝试其他类型时,例如 QString:
QString *p = nullptr;
{
QString str = "test";
p = &str;
}
cout << *p;
代码总是正确地打印值,即使它不应该。 str 的值超出了范围,我也没有通过将其绑定到 const 引用来延长它的生命周期。
有趣的是,QString 的类示例的行为与我预期的一样,test2() 打印出乱码,因为该值确实超出了范围,m_P 变成了悬空指针。
那么const char *的值的实际生命周期是多少?
【问题讨论】:
-
您无法测试是否有东西悬空。任何这样做的尝试都会产生未定义的行为。
-
这基本上是stackoverflow.com/questions/6441218/… 的一个副本,另外还有一个关于字符串文字的生命周期的问题
-
“在我的测试中它不是” 大声笑你什么?