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

1 c++ shared-ptr

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

预期产量:
100
100

实际产量:
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;
}
Run Code Online (Sandbox Code Playgroud)

Soa*_*Box 6

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

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

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

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