2016-01-19 3 views
0

У меня есть shared_ptr, указывающий на буфер динамически распределенной памяти char s. Позвольте мне называть это shared_ptrOwnerSharedPointer.Смешивание shared_ptr и нормального ptr

Теперь, если я заявляю:

char * borrowerPtr; 

и сделать это:

borrowerPtr = OwnerSharedPointer.get(); 

и передать borrowerPtr к некоторой функции, которая в конечном итоге использует данные, хранящиеся в выделенной памяти. Что-то не так с этим?

+2

Не так давно, как вы * знаете, 'shared_ptr' перейдет в исходный ptr. Иногда вам нужно это сделать, скажем, чтобы вызвать унаследованную функцию C. – BoBTFish

+0

Как вы создали «std :: shared_ptr», указывающий на буфер динамически распределенной памяти «char's»? Такого не существует. Только 'std :: unique_ptr' частично специализирован для массивов. – 5gon12eder

+0

@ 5gon12eder Это своего рода не имеет значения. Но да, я имел в виду, что каждая единица памяти имеет тот же размер, что и у персонажа. – TheBlueNotebook

ответ

2

Есть ли что-то не так с этим?

Возможно. Я могу представить два сценария:

  1. Функция вызывает delete на указателе.
  2. Счетчик ссылок общего указателя равен 0, а получатель удаляется до использования borrowerPtr.
2

Это зависит.

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

Если OwnerSharedPointer уничтожен, прежде чем получить доступ к borrowerPtr и нет никакой другой std::shared_ptr ссылки на pointee, вы будете соваться в темную область неопределенного поведения. Не делай этого.

Если вы не знаете, будет ли уничтожен OwnerSharedPointer, прежде чем вы получите доступ к borrowerPtr, используйте вместо него std::weak_ptr. Это обеспечивает проверенный доступ к указателю без увеличения количества владельцев.