Если я сделаю следующее,
int* p = new int(10);
std::shared_ptr<int>(p);
delete p;
Что здесь происходит? Это shared_ptr
неверно после удаления необработанного указателя? Есть ли способ обеспечить безопасность доступа к памяти при таком сценарии?
Код в вашем вопросе содержит 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);
,