gpt4 book ai didi

c++ - 可以在分配它的对象被销毁后访问返回的 LValue 引用

转载 作者:行者123 更新时间:2023-11-28 07:22:58 26 4
gpt4 key购买 nike

我无法理解这段代码为何有效。我进入 C# 世界已经有一段时间了,想在深入研究 C++11 中的新内容(如 RValue Refs 和移动语义)之前先复习一下 C/C++。

我想知道为什么我编写的这段代码有效:

class InnerMember
{
private:
int _iValue;

public:
InnerMember(): _iValue(0) {};
InnerMember(int iValue) : _iValue (iValue) {};

int GetValue(void) { return _iValue; }
int SetValue(int iValue) { _iValue = iValue; }
};

class TestClass
{
private:
InnerMember _objValue;

public:
TestClass() : _objValue(1) {};

void SetValue(int iValue)
{
_objValue.SetValue(iValue);
}

InnerMember& GetRef(void)
{
return _objValue;
}

virtual ~TestClass() { std::cout << "I've been released!" << std::endl; }
};

int main (int argc, char *argv[])
{

TestClass* pobjTest = new TestClass();

std::cout << "Before:" << std::endl;
std::cout << pobjTest->GetRef().GetValue() << std::endl;

pobjTest->SetValue(5);

InnerMember& robjInner = pobjTest->GetRef();

delete pobjTest;

std::cout << "After:" << std::endl;
std::cout << robjInner.GetValue();

return 0;
}

输出是:

Before:
1
I've been released!
After:
5
Press any key to continue...

我认为这会导致错误,因为我在 TestClass 被销毁后从 TestClass 访问引用对象 InnerMember。是否正在进行某种返回值优化?或者它真的返回一个拷贝而不是传回引用?

我使用 GCC,没有优化 (-O0),它仍然可以正常运行。

我还使用了 -S 开关来生成程序集,但我的 AMD64 知识生锈了,名称修改也无济于事。

最佳答案

这是未定义的行为,这意味着即使是“正确”的行为也可能发生。当您在 C++ 中删除某些内容时,它不会从内存中删除,因此在其他内容覆盖它之前访问它有时可能仍然有效。

关于c++ - 可以在分配它的对象被销毁后访问返回的 LValue 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19172297/

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