建议将指向堆内存的指针声明为`const`ALWAYS吗
Is it advisable to declare pointer to heap memory as `const` ALWAYS?
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
这个问题是关于保持良好的编程实践和编码风格。
嗯,我使用原始堆指针的唯一时间是编写自己的数据结构。如果您为它们使用了const指针,那么您的数据结构将立即变为不可分配。这可能是你想要的,也可能不是你想要的。
我不太愿意说总是,但在许多/大多数情况下,您的建议似乎是合理的。构造正确性是大多数C++人员在函数参数中相当关注的问题,但在局部(甚至成员(变量中则不那么关注。我们最好这样做。
我看到了一个主要的潜在问题:
在delete
之后,您应该将指针设置为NULL,以(帮助(防止它在代码的其他部分中使用。
Const不会允许你这样做。
我认为,如果指针不会改变,那么使用它是不寻常的。也许是因为我在普通代码中几乎从未使用过new
,而是依赖于容器类。
否则,通过尽可能使事物变常量来保持常量的正确性通常是个好主意。
相关文章:
- 为什么函数声明中允许 const?
- 在内存不足之前,我可以声明多少个 const 变量?
- 如何在声明为 const 的方法中更改类成员
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 可以使用<size_t>static_const(),std::as_const()或static_cast<const size_t>()来声明数组吗?
- 为什么必须将 const 添加到 constexpr 中才能进行字符串文字声明?
- 声明与 const 变量和成员函数相同的标识符
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 类中的const声明
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 为什么我们在这个函数声明中使用 const 和 & ?
- 为什么重载运算符>在参数声明 const 时不起作用?
- 在C 中声明const Pointer是常见的
- 声明“const”“boost::range”的正确方法
- 在声明'const'函数中循环访问具有'const_iterator'的集合会导致错误
- 什么是最好的以及如何在 C++ 函数中声明 const
- 我可以从引用传递的参数返回值中声明const int吗
- 在函数中声明const而不是变量有什么好处吗?
- 是否在类外部重新声明const静态变量
- 声明const全局变量时需要静态的