我使用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)
您需要传递共享指针,而不是直接传递给int的引用和指针.
发生的事情是共享指针永远不会传递到test_shared_ptr()函数之外的任何地方.当该函数返回时,共享指针被销毁.当它发现其他任何东西都没有引用它的内存时,它就会破坏它所指向的内存.
基本上,您正在使用int &i和int *i更改两者使用std::tr1::shared_ptr<int> i.
您可能需要更多地阅读共享指针.基本上,它们为它们指向的指针保留引用计数.当它们被复制时,它们会引用引用计数,当它们被销毁时会减少它.当引用计数达到0(没有别的东西引用它所指向的内存时)它会释放该内存.因此,即使在您的情况下某些东西使用了该指针,因为它没有使用共享指针,因此共享指针无法知道内存仍在使用,因此它可以释放它.
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |