Интерфейс C ++ между необработанными указателями и shared_ptr - PullRequest
4 голосов
/ 15 августа 2010

У меня есть код, который использует сырые указатели повсюду.

Нужно вызвать метод, который берет необработанный указатель в shared_ptr.Этот метод не находится под моим контролем, принадлежащих к внешнему API.Я не могу просто передать указатель на shared_ptr, потому что когда он будет удален, когда shared_ptr выйдет из области видимости в методе (когда метод вернется).

Есть ли у меня какая-либо опция, кроме как сделать мой необработанный указательshared_ptr в моем внутреннем коде?

Ответы [ 2 ]

10 голосов
/ 15 августа 2010

Это звучит несколько необычно и потенциально довольно опасно, но вы можете сделать это, используя средство удаления без операции при создании shared_ptr:

struct no_op_delete
{
    void operator()(void*) { }
};

int* p = 0; // your pointer
std::shared_ptr<int> sp(p, no_op_delete());

Когда sp и все сделанные из него копии были уничтожены, no_op_delete будет вызываться для очистки удерживаемого указателя. Поскольку это ничего не делает, вы получаете поведение, которое вам нужно.

1 голос
/ 15 августа 2010

Джеймс уже ответил на вопрос. Итак, это всего лишь предложение. Если вы знаете, что вызов функции не изменяет объект (например, устанавливает некоторые элементы данных и т. Д.), Вы можете создать новый объект из вашего необработанного указателя и передать его через shared_ptr функции. Таким образом, вы предполагаете, что функция становится владельцем объекта и выполняет все, что требуется. Конечно, это не сработает, если функция изменит объект в нем. Это может работать, если функция использует объект только для чтения для выполнения какой-либо другой операции (например, файловый ввод / вывод, например)

...