【发布时间】:2017-03-17 17:59:00
【问题描述】:
我正在尝试将一个指向堆栈变量的指针传递给一个只需要boost::shared_ptr 的函数(我无法控制)。
根据this answer,使用boost::make_shared 是要走的路。为了测试这个功能,我写了这个:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
int main(int argc, char const *argv[])
{
int i = 10;
boost::shared_ptr<int> int_ptr = boost::make_shared(i); // doesn't work
some_function(int_ptr); // this function takes only shared_ptr
return 0;
}
但它会引发以下错误:
error: no matching function for call to ‘make_shared(int&)’
boost::shared_ptr<int> int_ptr = boost::make_shared(i);
^
如果我像这样添加模板参数,它可以工作,但这是什么原因?
boost::shared_ptr<int> int_ptr = boost::make_shared<int>(i);
谢谢!
【问题讨论】:
-
问问自己,如果你只是给它一个
int,函数应该是什么类型的共享指针。它怎么知道你想要shared_ptr<int>而不是shared_ptr<vector<int>>,后者也可以由int构造。 -
请注意,模板参数推导不能包含有关结果将被分配到的类型的信息。在确定适当的模板参数时,不能考虑
boost::shared_ptr<int> int_ptr =部分。 -
创建一个指向堆栈分配内存的
shared_ptr在尝试删除该内存时将是灾难性的。i是否需要通过指针进行修改,还是i的副本就足够了? -
@chris
i不需要修改,一个副本就足够了,但我认为这就是使用make_shared的全部意义所在。因为我必须将int_ptr发送到的函数除了shared_ptr之外不接受任何其他选项。 -
@simplename,嗯,问题指定了一个指向堆栈变量的指针。这不一定是
make_shared的重点。它避免了代码中的new,它对动态分配进行了优化,并防止在f(new A, new A)等情况下异常泄漏对象的可能性。
标签: c++ boost make-shared