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