关于c ++:使用指针时的注意事项?

Precautions while using pointers?

本问题已经有最佳答案,请猛点这里访问。

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


Pointers are the core to programming languages like C and C++.

不一定是"指针",我们来谈谈参考文献…

注释(!)在C和C++(尤其是C++ 11语言标准)中使用的范式中,指针的角色发生了根本性的变化。所以很难公平地处理它们,

关于C++:

"原始"C指针的用法强烈地阻碍了C++中的编程,至少在使用EDCOX1、6或EDCOX1×7(这是在应用程序中容易引起内存泄漏的主要点)动态分配这些指针时。

在C++中,使用引用(参见EDCOX1,8)和EDCOX1,9个操作符),对于C来说是最好的(因为它们不能导致"悬空引用"和"悬空指针"之类的东西)。

C++中引入的原理被命名为RAII,并且管理任何类实例的生命周期,其主要来自任何函数和执行路径的调用堆栈范围(不管这些调用是否在同一线程中调用)。我并不是说这不能只用普通的C语言实现,但它更困难,更容易出错。

在C++应用程序中,堆分配类实例的正确内存管理应该使用C++ 11的智能指针FraseIs,或者至少使用良好的旧(同时弃用)EDCOX1×10类,用于预C++ 11标准。

What are some precautions that must be taken while using pointers in C and C++?

当然,在C++中使用原始指针(特别是C和C++ API之间的接口时)有一些用例,但是你应该总是测试它们的有效性,并且知道你实际上在做什么。所有其他的案例都被C++标准所覆盖,你只需要使用正确的标准智能指针类就可以从你的问题中解脱出来。


在评论和Floris的回答中有一些很好的建议,但是我的"不要使用指针"不是其中之一

共享资源对于防止泄漏非常有用,但您不能总是使用它们。例如,您不应该将它们与boost::侵入性容器一起使用。

另外,如果您有一个包含所述共享指针的容器,并且您只是添加但从不从该容器中移除,那么共享指针将不会对您有所帮助。你仍然"泄漏"资源,尽管你没有失去删除它的能力。

其他杂项提示:

与所有资源一样,我发现最好将分配和释放一种类型的代码路径最小化,以便在审阅和/或检测中匹配它们。

在分配C字符串时,不要忘记为终止符预留空间。


  • 总是初始化它们
  • 检查边界(指针偏移/索引的大小)
  • free完成后的内存
  • 释放后设置为NULL
  • 在访问之前检查它们是否为NULL
  • 当你malloc时,使用thing = malloc(N * sizeof *thing)
  • 不要覆盖在free之前的malloced指针。