Как я могу увеличить количество владельцев указателя std :: shared

У меня есть структура, которая имеет указатель в качестве члена:

struct MyStruct {
char *ptr;
}

Я хочу инициализировать ptr в области, а затем иметь возможность использовать его вне этой области:

{ // scope 0
{ //scope 1

{ // scope 2
mystruct.ptr = new char[100];
}

// mystruct.ptr still lives here
}

// i dont need mystruct anymore
delete[] mystruct.ptr;
}

Но потом я должен удалить его позже, что подвержено ошибкам, и я бы предпочел избежать этого. Вот я и подумал использовать std::shared_ptr,

{ // scope 0
{ //scope 1

{ // scope 2
auto a = std::make_shared<char>(new char[100]);
mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN
}

// mystruct.ptr still SHOULD live here
}
}
  • Итак, как я мог это сделать? Как мне назначить shared_ptr для mystruct.ptr, чтобы количество владений стало равным 2? Я вижу, что get () не работает, потому что он просто передает указатель, но не дает владения, поэтому он удаляется.

  • Как видите, основной мотивацией здесь является продление жизни, поэтому я открыт для других практик. Может быть, я ошибаюсь, думая об использовании shared_ptr здесь?

0

Решение

Не существует легального способа увеличить счетчик владения std :: shared_ptr, кроме присвоения его другому экземпляру std :: shared_ptr. В любом случае это не решило бы вашу проблему. В вашей ситуации вы должны позаботиться о правильном обновлении / удалении / удалении / использовании используемой памяти. Если вы манипулируете share_ptr, вы должны позаботиться о том, чтобы вы тоже уменьшили его, иначе вы получите утечку памяти. Это та же самая ситуация.

  • Если у вас есть контроль над структурой MyStruct, измените ее на std :: string или std :: shared_ptr. Если нет, придерживайтесь нового / удалите ИМХО. Это как минимум читабельно и честно.
  • Если у вас есть контроль над областью области 0, используйте там std :: unique_ptr. Это имело бы смысл, так как вам не нужно заботиться об исключениях. Если вы не знаете, какой размер там нужен, придерживайтесь new / delete.
3

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


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