gpt4 book ai didi

c++ - 如何保留局部变量的值并在 C++ 中重新访问外部

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:34 25 4
gpt4 key购买 nike

我使用 boost shared_ptr 来包装一个指针。但是我只能在 test_shared_ptr() 中得到正确的值,而在 main() 中,我得到了错误的值。

Expected output:
100
100

Actual output:
100
-572662307

在那种情况下,指针似乎变得无效了。有什么正确的方法来完成这项工作?提前致谢。

下面是源代码。

#include <memory>
#include <iostream>


class TestClass
{
public:
TestClass(int &i);
void print_i();
private:
int *_i;
};

TestClass::TestClass(int &i) : _i(&i)
{

}

void TestClass::print_i()
{
std::cout << *_i << std::endl;
}


void print_i(int &i)
{
std::cout << i << std::endl;
}

TestClass *test_shared_ptr()
{
std::tr1::shared_ptr<int> i(new int());

*i = 100;

print_i(*i);

return new TestClass(*i);
}


int main(int argc, char** argv)
{
TestClass *p = test_shared_ptr();
p->print_i();
return 0;
}

最佳答案

您需要传递共享指针,而不是直接指向 int 的引用和指针。

发生的事情是共享指针永远不会传递到 test_shared_ptr() 函数之外的任何地方。当该函数返回时,共享指针被销毁。当它发现没有其他东西引用它的内存时,它会破坏它指向的内存。

基本上,您在哪里使用 int &iint *i将两者都更改为使用 std::tr1::shared_ptr<int> i .

您可能需要多了解一下共享指针。基本上,它们为它们指向的指针保留一个引用计数。当它们被复制时,它们会增加引用计数,当它们被销毁时会减少它。当引用计数达到 0(没有其他东西引用它指向的内存)时,它会释放该内存。因此,即使在您的情况下某些东西正在使用该指针,因为它没有使用共享指针,所以共享指针无法知道内存仍在使用,因此它会释放它。

关于c++ - 如何保留局部变量的值并在 C++ 中重新访问外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141648/

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