Удалить необработанный указатель после создания из него shared_ptr

Если я сделаю следующее,

int* p = new int(10);
std::shared_ptr<int>(p);
delete p;

Что здесь происходит? Это shared_ptr неверно после удаления необработанного указателя? Есть ли способ обеспечить безопасность доступа к памяти при таком сценарии?

2

Решение

Код в вашем вопросе содержит 2 противоречивых определения p, Я предполагаю, что вы хотели опубликовать что-то вроде

int* p = new int(10);
std::shared_ptr<int> p1(p);
delete p;

Когда shared_ptr выходит за рамки видимости и его счетчик ссылок падает до нуля, он будет пытаться delete p;, что приводит к двойному удалению и неопределенному поведению.

Вы передали право собственности на динамически распределенные int к shared_ptrтак что пусть он выполняет свою работу, и не стоит удалять int сам.


Если вы хотите, чтобы клиенты вашего API делали что-то похожее на приведенный выше код, одна из возможностей — изменить тип параметра функции API с shared_ptr в пакет параметров аргументов конструктора. Например

template<typename T, typename... Args>
void api_func(Args&&... args)
{
auto p = std::make_shared<T>(std::forward<Args>(args)...);
// Use the shared_ptr p as before
}

Затем вместо прохождения shared_ptr<int>клиентский код будет вызывать вышеуказанную функцию как api_func<int>(10);,

6

Другие решения


По вопросам рекламы [email protected]