Какая версия safe_delete лучше?

Разобрался: GRANT SELECT ON OTHER_TABLE TO dbo

Меня поразило использование слова «владелец таблицы», когда я искал инструкции о том, как это сделать. Я думал, что я был владельцем стола. Скорее, это схема (dbo), которая нуждается в привилегиях.

5
задан a3f 16 April 2015 в 08:14
поделиться

8 ответов

Очевидно функция, по простой причине. Макрос оценивает свой аргумент многократно. Это может иметь злые побочные эффекты. Также функция может быть ограничена по объему. Ничто лучше, чем это :)

6
ответ дан 18 December 2019 в 05:21
поделиться

Я не сказал бы ни одного, поскольку оба дадут Вам ложное чувство защищенности. Например, предположите, что у Вас есть функция:

void Func( SomePtr * p ) {
  // stuff
  SafeDelete( p );
}

Вы устанавливаете p в NULL, но копии p вне функции незатронуты.

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

17
ответ дан 18 December 2019 в 05:21
поделиться

удалите a;

ISO, который указывает C++, которые удаляют на Нулевом указателе просто, ничего не делает.

Кавычка из ISO 14882:

    5.3.5 Delete [expr.delete]

    2   [...] In either alternative, if the value of the operand of delete is the 
        null pointer the operation has no effect. [...]

С уважением, Бодо

/ редактирование: Я не заметил a=NULL; в исходном сообщении, так новая версия: удалите a; a=NULL; однако, на проблему с установкой a=NULL уже указали (ложное чувство безопасности).

7
ответ дан 18 December 2019 в 05:21
поделиться

Обычно предпочтите подставляемые функции по макросам, поскольку макросы не уважают объем и могут конфликтовать с некоторыми символами во время предварительной обработки, ведя к очень странным ошибкам компиляции.

Конечно, иногда шаблоны и функции не будут делать, но здесь дело обстоит не так.

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

(редактирование) Как другие указало, безопасный - удаляют, не безопасно, как, даже если кто-то не забывает использовать его, оно все еще не может иметь желаемого эффекта. Таким образом, это на самом деле абсолютно бесполезно, потому что для использования safe_delete правильно нужна более мысль, чем просто установка на 0 собой.

5
ответ дан 18 December 2019 в 05:21
поделиться

Я думаю

#define SAFE_DELETE(pPtr) { delete pPtr; pPtr = NULL } лучше

  1. хорошо для вызова удаляют, если pPtr является ПУСТЫМ. Таким образом, если проверка не требуется.
  2. в случае, если при вызове SAFE_DELETE (ptr+i) он приведет к ошибке компиляции.
  3. Шаблонное определение создаст несколько экземпляров функции для каждого типа данных. По-моему, в этом случае эти повторные определения donot добавляют любое значение.
  4. Кроме того, с шаблонным определением функции, Вы имеете наверху вызова функции.
2
ответ дан 18 December 2019 в 05:21
поделиться

Использование SAFE_DELETE действительно, кажется, подход программистов C к присваиванию созданного в управлении памятью в C++. Мой вопрос: C++ позволит этот метод использования SAFE_DELETE на указателях, которые правильно инкапсулировались как Частные? Этот макрос только работал бы над указателем, которые объявляются Общественностью? ООП ПЛОХО!!

1
ответ дан 18 December 2019 в 05:21
поделиться

Вы не должны тестировать на ничтожность с delete, это эквивалентно нет. (a) = NULL заставляет меня поднять бровь. Второй вариант лучше.

Однако, если у Вас есть выбор, необходимо использовать интеллектуальные указатели, такой как std::auto_ptr или tr1::shared_ptr, которые уже делают это для Вас.

2
ответ дан 18 December 2019 в 05:21
поделиться

Как упомянуто вполне немного выше, второй является лучшим, не макросом с потенциальными непреднамеренными побочными эффектами, не имеет ненужной проверки по сравнению с ПУСТЫМ УКАЗАТЕЛЕМ (хотя я подозреваю, что Вы делаете это как проверку типа), и т.д. Но ни один не обещает безопасности. Если Вы действительно используете что-то как tr1:: smart_ptr, удостоверьтесь, что Вы читаете документы о них и уверены, что он имеет правильную семантику для Вашей задачи. Я просто недавно должен был выследить и очистить огромную утечку памяти из-за коллеги, помещающего smart_ptrs в структуру данных с круговыми ссылками :) (он должен был использовать weak_ptrs для обратных ссылок),

0
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

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