Целесообразно ли объявлять указатель на кучу памяти как `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, когда это возможно.