编辑:有关此问题代码工作原因的问题已通过重复标记中的链接问题得到解答。关于字符串文字生存期的问题在这个问题的答案中得到了回答。const char * value lifetime
我想了解如何以及何时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
以其价值超出了范围,并且我也没有通过将其与常量参考绑定来延长其寿命。
有趣的是,带有QString
的类示例的行为与我所预期的相同,test2()
会打印乱码,因为该值确实超出了范围,m_P
成为悬挂指针。
那么const char *
的实际使用寿命值是多少?
您无法测试是否有什么悬挂。任何尝试这样做都会有不确定的行为。 –
这基本上是一个重复http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope与一个问题关于字符串文字的生命期 –
_“在我的测试中,它不是”_LOL你什么? –