Как намеренно удалить повышение:: shared_ptr?

В вашем контроллере MyController вы должны ввести сервис, заменив:

MyService ss = new MyService();

на:

@Autowired
MyService ss;

Кроме того, вместо вашего ApplicationProperties класса вы можно использовать аннотацию @Value из Spring для загрузки свойств из файла application.properties. Посмотрите на этот код:

import org.springframework.beans.factory.annotation.Value;
// ...

@Service
public class MyService {

    @Value("${port}")
    private String port;

    // ...
}
45
задан Sam 23 August 2014 в 10:19
поделиться

4 ответа

Вы просто делаете

ptr.reset();

, Посмотрите shared_ptr руководство . Это эквивалентно

shared_ptr<T>().swap(ptr)

, Вы звоните reset на каждом интеллектуальном указателе, который не должен больше ссылаться на объект. Последнее такой reset (или любое другое действие, которое вызывает подсчет ссылок, опускаются до нуля, на самом деле) вызовет объект быть free'ed использование средства удаления автоматически.

, Возможно, Вы интересуетесь Методы программирования Интеллектуального указателя . Это имеет запись приблизительно задержанное освобождение .

82
ответ дан Mankarse 26 November 2019 в 21:05
поделиться

Смысл boost::shared_ptr<T> - то, что объект пуанта будет удален точно в тот момент времени, когда никакой shared_ptr<T> с укажут на него - то есть, когда последнее shared_ptr<T> указание на этот объект выходит из объема или повторно присвоено указать на другой объект. Так, все, что необходимо сделать для удаления объекта, удостоверяются, что нет никаких shared_ptr<T> с, указывая на него. Например, если у Вас только есть сингл shared_ptr<T> названный p указание на объект, которому или позволяют это упасть из объема или вызова p.reset() (эквивалентный p = NULL для простого указателя), или присвоить его для указания на что-то еще.

, Если Вы имеете два shared_ptr<T> с, указывая на объект, необходимо будет повторно присвоить им обоим.

РЕДАКТИРОВАНИЕ: Благодаря dehmann для указания, что p = NULL; не на самом деле допустимый код для shared_ptr<T>...:)

8
ответ дан j_random_hacker 26 November 2019 в 21:05
поделиться

Что вы хотите сделать, это вернуть слабые ссылки, используя boost :: weak_ptr , который можно преобразовать к shared_ptr, когда это необходимо. Это может позволить вам контролировать время жизни объекта в shared_ptr, а те, кто хочет получить к нему доступ, могут удерживать weak_ptr и пытаться преобразовать в shared_ptr. Если это преобразование завершается неудачно, они могут повторно запросить и вернуть объект в память.

4
ответ дан 26 November 2019 в 21:05
поделиться

Если вы хотите иметь возможность намеренно удалять объекты (я делаю это все время), тогда вы должны использовать единоличное владение. Вас соблазнили использовать shared_ptr, когда это не подходит для вашего дизайна.

9
ответ дан 26 November 2019 в 21:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: