Разобрался: GRANT SELECT ON OTHER_TABLE TO dbo
Меня поразило использование слова «владелец таблицы», когда я искал инструкции о том, как это сделать. Я думал, что я был владельцем стола. Скорее, это схема (dbo), которая нуждается в привилегиях.
Очевидно функция, по простой причине. Макрос оценивает свой аргумент многократно. Это может иметь злые побочные эффекты. Также функция может быть ограничена по объему. Ничто лучше, чем это :)
Я не сказал бы ни одного, поскольку оба дадут Вам ложное чувство защищенности. Например, предположите, что у Вас есть функция:
void Func( SomePtr * p ) {
// stuff
SafeDelete( p );
}
Вы устанавливаете p в NULL, но копии p вне функции незатронуты.
Однако, если необходимо сделать это, пойдите с шаблоном - макросы будут всегда иметь потенциал для того, чтобы затоптать на других именах.
удалите 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 уже указали (ложное чувство безопасности).
Обычно предпочтите подставляемые функции по макросам, поскольку макросы не уважают объем и могут конфликтовать с некоторыми символами во время предварительной обработки, ведя к очень странным ошибкам компиляции.
Конечно, иногда шаблоны и функции не будут делать, но здесь дело обстоит не так.
Кроме того, лучший сейф - удаляет, не необходимо, поскольку Вы могли использовать интеллектуальные указатели, поэтому не требуя, чтобы не забыть использовать этот метод в клиентском коде, но инкапсулировать его.
(редактирование) Как другие указало, безопасный - удаляют, не безопасно, как, даже если кто-то не забывает использовать его, оно все еще не может иметь желаемого эффекта. Таким образом, это на самом деле абсолютно бесполезно, потому что для использования safe_delete правильно нужна более мысль, чем просто установка на 0 собой.
Я думаю
#define SAFE_DELETE(pPtr) { delete pPtr; pPtr = NULL }
лучше
Использование SAFE_DELETE действительно, кажется, подход программистов C к присваиванию созданного в управлении памятью в C++. Мой вопрос: C++ позволит этот метод использования SAFE_DELETE на указателях, которые правильно инкапсулировались как Частные? Этот макрос только работал бы над указателем, которые объявляются Общественностью? ООП ПЛОХО!!
Вы не должны тестировать на ничтожность с delete
, это эквивалентно нет. (a) = NULL
заставляет меня поднять бровь. Второй вариант лучше.
Однако, если у Вас есть выбор, необходимо использовать интеллектуальные указатели, такой как std::auto_ptr
или tr1::shared_ptr
, которые уже делают это для Вас.
Как упомянуто вполне немного выше, второй является лучшим, не макросом с потенциальными непреднамеренными побочными эффектами, не имеет ненужной проверки по сравнению с ПУСТЫМ УКАЗАТЕЛЕМ (хотя я подозреваю, что Вы делаете это как проверку типа), и т.д. Но ни один не обещает безопасности. Если Вы действительно используете что-то как tr1:: smart_ptr, удостоверьтесь, что Вы читаете документы о них и уверены, что он имеет правильную семантику для Вашей задачи. Я просто недавно должен был выследить и очистить огромную утечку памяти из-за коллеги, помещающего smart_ptrs в структуру данных с круговыми ссылками :) (он должен был использовать weak_ptrs для обратных ссылок),