Целесообразно ли объявлять указатель на кучу памяти как `const` ВСЕГДА?
T *p = new T();
Для указателя на кучу могут быть катастрофические операции, такие как
p++; // (1) scope missed
p = new T(); // (2) re-assignment
Это приведет к утечкам памяти или сбоям из-за неправильного delete
. Помимо использования интеллектуальных указателей, рекомендуется всегда делать указатель кучи a const
;
T* const p = new T(); // now "p" is not modifiable
Этот вопрос касается поддержания хорошей практики программирования и стиля кодирования.
Ответы
Ответ 1
Я смущаюсь сказать всегда, но то, что вы предлагаете, кажется разумным для многих/большинства случаев. Корректность - это то, что большинство людей С++ уделяют внимание функциональным параметрам, но не столько в локальных (или даже элементарных) переменных. Нам может быть лучше сделать это.
Ответ 2
Ну, о единственном времени, когда я использую грубые указатели кучи, - это писать собственные структуры данных. и если вы используете для них указатель const, ваша структура данных сразу становится неприменимой. который может или не может быть тем, что вы хотите.
Ответ 3
Я вижу одну серьезную потенциальную проблему:
после delete
вы должны установить указатель на NULL (помочь), чтобы он не использовался в других частях кода.
Const не позволит вам сделать это.
Ответ 4
Я считаю, что необычно использовать указатель, если он не изменится. Возможно, потому, что я почти никогда не использовал new
в нормальном коде, но полагаюсь на классы контейнеров.
В противном случае, как правило, рекомендуется сохранять const-correctness, делая вещи const, когда это возможно.