Хотя ответ Guilherme Ferreira подробно описывает вывод аргумента шаблона (и является правильным в этом отношении), я считаю, что это не тот ответ, который вы ищете.
Я пытаюсь передать указатель на переменную стека функции (я не контролирую), которая принимает только boost::shared_ptr.
shared_ptr
означает совместное владение указанным объектом. Если функция, которую вы пытаетесь вызвать, сохраняет указатель в какой-либо из своих структур данных, например, в контейнере, а затем возвращается, указатель станет висящим, как только значение в стеке будет уничтожено, несмотря на то, что shared_ptr
все еще сохраняется. ссылка. Чтобы сделать то, что вы хотите, вы должны быть абсолютно уверены, что функция нигде не сохраняет указатель и может использовать его только во время этого одного вызова.
При выполнении этого условия можно создать shared_ptr
, указывающий на значение в стеке, но нельзя использовать для этого make_shared
. make_shared
выделяет новый объект в куче вместе со счетчиком ссылок для него и инициализирует его аргументами, которые вы передали вызову функции. Возвращенный shared_ptr
указывает на этот новый объект, а не на объект в стеке.
void foo()
{
int n = 10;
boost::shared_ptr< int > pn = boost::make_shared< int >(n);
assert(*pn == 10); // succeeds
assert(pn.get() == &n); // fails
bar(pn);
}
Это означает, что изменения, которые bar
вносит в указанный int
, не отражаются на n
.
Чтобы создать shared_ptr
для существующего объекта, вы должны напрямую использовать его конструктор. Кроме того, поскольку время жизни объекта контролируется стеком, вы должны запретить shared_ptr
уничтожать объект. Это можно сделать, указав недействующее средство удаления в конструкции shared_ptr
.
void foo()
{
int n = 10;
boost::shared_ptr< int > pn(&n, boost::null_deleter());
assert(*pn == 10); // succeeds
assert(pn.get() == &n); // succeeds
bar(pn);
}
Обратите внимание, однако, что этот код по-прежнему выделяет память кучи для использования счетчика ссылок shared_ptr
, поэтому вы не выигрываете в производительности.
person
Andrey Semashev
schedule
20.03.2017
int
. Откуда он знает, что вам нуженshared_ptr<int>
, а неshared_ptr<vector<int>>
, который также может быть построен с помощьюint
. - person NathanOliver   schedule 17.03.2017boost::shared_ptr<int> int_ptr =
нельзя учитывать при определении соответствующих аргументов шаблона. - person François Andrieux   schedule 17.03.2017shared_ptr
, указывающего на выделенную в стеке память, будет иметь катастрофические последствия, когда он попытается удалить эту память. Нужно ли изменятьi
с помощью указателя или будет достаточно копииi
? - person chris   schedule 17.03.2017i
не нужно изменять, и копии будет достаточно, но я подумал, что в этом весь смысл использованияmake_shared
. Поскольку функция, которой я должен отправитьint_ptr
, не принимает ничего, кромеshared_ptr
, у меня нет другого выбора. - person simplename   schedule 17.03.2017make_shared
. Он избегаетnew
в вашем коде, оптимизирует динамическое размещение и предотвращает возможность утечки объекта из-за исключений в таких случаях, какf(new A, new A)
. - person chris   schedule 17.03.2017