Действительно ли безопасно 'удалить это'? [дубликат]

Я решил эту проблему, установив правильные значения json

{
  "qps": 30,
  "force_push": false
}

Вместо «ложь» в строковой записи я указал «ложь». Сейчас десериализация работает.

33
задан Brian Tompsett - 汤莱恩 2 July 2015 в 17:10
поделиться

9 ответов

delete this законно и делает то, что Вы ожидали бы: это называет деструктор Вашего класса, и освободите базовую память. После delete this возвраты, Ваш this значение указателя делает не изменение, таким образом, это - теперь висячий указатель, который должен не быть разыменованным. Это включает неявное разыменование с помощью членских переменных класса.

обычно находится в считаемых на ссылку классах это, когда касательно количества постепенно уменьшается к 0, DecrementRefCount() / Release() / безотносительно вызовов функции членства delete this.

delete this обычно считается очень невоспитанностью по многим причинам. Легко случайно получить доступ к членским переменным после delete this. Код вызывающей стороны не мог бы понять, что Ваш объект самоликвидировался.

кроме того, delete this "запах кода", что Ваш код не мог бы иметь симметричной стратегии монопольного использования объекта (кто выделяет и кто удаляет). <забастовка>, которую объект, возможно, не выделил сам с new, таким образом звоня delete this средства, что класс A выделяет объект, но класс B, позже освобождает его [сам].

46
ответ дан Chris Peterson 27 November 2019 в 17:34
поделиться

Безопасно удалить "это", пока это - по существу последняя операция в методе. На самом деле несколько профессиональных API уровня делают так (см. реализацию CComObject ATL для примера).

единственная опасность пытается получить доступ к любым другим членским данным после того, как вызов "удалит это". Это, конечно, небезопасно.

16
ответ дан JaredPar 27 November 2019 в 17:34
поделиться

Удалите это совершенно законно, как другие уже упомянули. Это опасно по одной дополнительной причине, которая еще не была упомянута - Вы предполагаете, что объект был выделен на "куче". Это может быть трудно гарантировать, хотя в случае подсчета ссылок реализации обычно не являются проблемой.

13
ответ дан 1800 INFORMATION 27 November 2019 в 17:34
поделиться

но не делайте этого в деструкторе!

13
ответ дан 27 November 2019 в 17:34
поделиться

Как указано другими, удалите, это - допустимая идиома, но чтобы было безопасно, что необходимо удостовериться, что объект никогда не инстанцируют на стеке.

Один способ сделать это должно сделать и конструктора и деструктор частными и осуществить создание объекта через функцию фабрики классов, которая создает объект на "куче" и возвращает указатель на него. Фабрика классов может быть статической функцией членства или другом функция. Очистка может затем быть сделана посредством Удаления () метод на объекте, который делает, "удаляют это". COM-объекты в основном прокладывают себе путь за исключением того, что, кроме того, они - ссылка, считаемая с, "удаляют это" появление, когда подсчет ссылок постепенно уменьшается для обнуления.

6
ответ дан Bruce Ikin 27 November 2019 в 17:34
поделиться

Да. Это должно прекрасно подойти. "Это" - просто указатель. Любой указатель сделает для, удаляют. Информация о том, как удалить объект, содержится в записях "кучи". Это то, как IUnknown:: Выпуск () обычно реализуется в COM-объектах.

3
ответ дан Steve Rowe 27 November 2019 в 17:34
поделиться

удалите это может вызвать проблему, когда у Вас есть подклассы объекта, Вы удаляете. Помните, что конструкция начинает с вершины вниз, и удаление начинает с вверх дном. Таким образом, если удаляют, это посреди иерархии, Вы в основном потеряли все объекты ниже этого конкретного класса.

удаляют, это прибывает очень удобное при реализации ссылки считаемый объект примером которого являются COM-классы.

3
ответ дан rptony 27 November 2019 в 17:34
поделиться

Read для подобного обсуждения. Ваше понимание является правильным в этом, оно действительно работает, необходимо и может быть опасно, так как Вы не можете получить доступ к этому впоследствии.

2
ответ дан Community 27 November 2019 в 17:34
поделиться

Законный да
безопасный никакой

2
ответ дан Martin York 27 November 2019 в 17:34
поделиться
Другие вопросы по тегам:

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