gpt4 book ai didi

c++ - const char * 值生命周期

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:41 31 4
gpt4 key购买 nike

<分区>

编辑:重复标记中的链接问题已经回答了为什么这个问题中的代码有效的问题。关于字符串文字生命周期的问题在这个问题的答案中得到了回答。

我试图了解 const char * 指向的字符串如何以及何时被释放。

考虑:

const char **p = nullptr;

{
const char *t = "test";
p = &t;
}

cout << *p;

离开内部范围后,我希望 p 成为指向 const char * 的悬空指针。但是在我的测试中它不是。这意味着即使在 t 超出范围之后,t 的值实际上仍然有效且可访问。

这可能是由于通过将临时对象绑定(bind)到 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 超出了它的值范围,我也没有通过将它绑定(bind)到 const 引用来延长它的生命周期。

有趣的是,带有 QString 的类示例的行为与我预期的一样,并且 test2() 打印出乱码,因为该值确实超出了范围并且 m_P 变成了悬挂指针。

那么 const char * 的值的实际生命周期是多少?

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com