使用指针时的注意事项?

时间:2014-02-13 00:00:46

标签: c++ c pointers

指针是C和C ++等编程语言的核心。这同时会导致许多错误和内存泄漏。 在C和C ++中使用指针时必须采取哪些预防措施?

3 个答案:

答案 0 :(得分:1)

  • 始终初始化它们
  • 检查边界(指针偏移/索引的大小)
  • free完成后的记忆
  • 解放后设置为NULL
  • 在访问
  • 之前检查它们不是NULL
  • 使用malloc时,请使用thing = malloc(N * sizeof *thing)
  • 请勿在{{1​​}}之前覆盖malloc的指针。
  • ...

答案 1 :(得分:1)

在评论和Floris的答案中有一些好的建议,但IMO“不要使用指针”不是其中之一

shared_ptrs非常适合防止泄漏,但您不能总是使用它们。例如,您不应该将它们与boost :: intrusive容器一起使用。

另外shared_ptrs不会帮助你,如果你有一个容器的所述shared_ptrs,你只需添加但永远不会从容器中删除。你仍然“泄漏”了资源,尽管你没有失去删除它的能力。


其他错误提示

与所有资源一样,我发现最好尽量减少可以分配一种类型的代码路径。释放,以便我可以在审查和/或仪表中匹配它们。

分配c-strings时不要忘记为终结者预留空间

答案 2 :(得分:1)

  

指针是C和C ++等编程语言的核心。

不是'指针',我们来谈谈参考......

注意(!),当涉及到与{{3}中使用的范例时,'指针'的角色发生了根本性的变化(特别是语言标准)。所以很难平等地处理它们,

关于

强烈建议不要在c ++中使用'raw'指针,至少在使用new()new[]()动态分配这些指针时(这是主要观点)在您的应用程序中容易导致内存泄漏)。

中,尽可能使用无法使用的引用(请参阅&&&运算符)(因为它们可以'导致'悬挂引用')之类的事情。

'dangling pointer'中引入的原则名为,并且主要从任何函数和执行路径的调用堆栈作用域管理任何类实例的生命周期(无论是否在相同的线程与否)。我不是说使用普通RAII无法实现,但它更难以容易出错。

在c ++应用程序中,堆分配的类实例的正确内存管理应使用smart pointer facilities来完成,或者至少使用旧的(同时弃用的){{ 1}} class,适用于pre c ++ 11标准。

  

在C和C ++中使用指针时必须采取哪些预防措施?

当然,在c ++中使用原始指针有一些用例(特别是在c和c ++ API之间进行接口时),但是你应该总是测试它们的有效性,并且知道你的内容很好真的在做! c ++标准很好地涵盖了所有其他情况,你只需要使用正确的标准智能指针类来摆脱你的问题。