[英]How to retain local variable's value and revisit outside in C++
我用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;
}
您需要传递共享指针,而不是直接将引用和指针传递给int。
发生的事情是共享指针永远不会传递到test_shared_ptr()函数之外的任何地方。 当该函数返回时,共享指针将被销毁。 当发现没有其他引用对其内存的引用时,它将破坏其指向的内存。
基本上,在使用int &i
和int *i
将它们都更改为使用std::tr1::shared_ptr<int> i
。
您可能需要多读一些共享指针。 基本上,它们为所指向的指针保留引用计数。 复制它们时,它们将增加引用计数,销毁它们时将其递减。 当引用计数达到0(没有其他东西正在引用它所指向的内存)时,它将释放该内存。 因此,即使在您的情况下某些东西正在使用该指针,因为它没有使用共享指针,所以共享指针无法知道内存仍在使用中,因此它将释放它。
在这种情况下,指针似乎变得无效
当然,它变得无效。 当您离开test_shared_ptr时,shared_ptr会被删除,此后我不存在。
任何正确的方法来完成这项工作?
1)简单地复制i的值。 (在TestClass中使用int i而不是int * i)。 int很小,您不会丢失任何东西。
要么
2)在测试类中使用std :: tr1 :: shared_ptr <int>代替int *。
您遇到的问题与API合同有关。
我不想使用共享指针在TestClass的构造函数中传递变量值,因为我不想强制api用户使用智能指针
当前,您的TestClass
合同看起来像您希望调用方维护int
项,以便其寿命比TestClass
更长。
但是,您的测试用例不遵循此合同规则。
实际上,我想在我的应用程序中通过引用而不是通用类型传递对象。
通过引用或指针传递与“泛型”类型无关。
这是您的代码测试API的一种可能的修复方法,然后int的范围就长了,然后又足够长(直到应用程序结束)以处理TestClass
所有用法
TestClass *test_shared_ptr(int &i)
{
i = 100;
print_i(i);
return new TestClass(i);
}
int main(int argc, char** argv)
{
std::tr1::shared_ptr<int> i(new int());
TestClass *p = test_shared_ptr(*i);
p->print_i();
return 0;
}
您所做的确实打破了shared_ptr的意义。 基本上,当您将其从该函数中传递出去时,它是否应该神奇地打破了,因此不能释放指向的内存呢?
不,它可以释放它。 您是否希望shared_ptr仍然存在于函数之外,以便当“ p”超出范围时,它将设法调用shared_ptr析构函数? 这不可能发生。 p是一个指针,而不是shared_ptr类。
返回shared_ptr或返回new'd指针并自己删除它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.