是否建议将指向堆内存的指针声明为`const`总是?

时间:2011-06-05 14:01:27

标签: c++ coding-style

T *p = new T();

对于堆上的指针,可能会有灾难性的操作,例如,

p++;  // (1) scope missed
p = new T(); // (2) re-assignment

由于错误delete导致内存泄漏或崩溃。除了使用智能指针之外,建议始终使堆指针成为const;

T* const p = new T();  // now "p" is not modifiable

这个问题涉及保持良好的编程习惯和编码风格。

4 个答案:

答案 0 :(得分:7)

好吧,关于我使用原始堆指针的唯一一次是编写自己的数据结构。如果你使用const指针,你的数据结构会立即变得无法分配。这可能是也可能不是你想要的。

答案 1 :(得分:2)

我毫不犹豫地说总是,但你提出的建议似乎对很多/大多数情况都是合理的。 Const正确性是大多数C ++人员在函数参数中需要引起注意的东西,但在本地(甚至成员)变量中却没有那么多。我们可能会更好。

答案 2 :(得分:2)

我看到一个主要的潜在问题:

delete之后你应该将指针设置为NULL来(帮助)防止它被用在代码的其他部分。

Const不允许你这样做。

答案 3 :(得分:1)

我相信如果它不会改变,使用指针是不常见的。也许是因为我几乎没有在普通代码中使用new,而是依赖于容器类。

否则,通过尽可能使const成为const来保持const-correctness通常是个好主意。