使用指针时DO和Donts

Sac*_*iya 7 c c++ pointers

这是一个简单而重要的问题.在C和C++中使用指针时有什么做点和做法,以确保在AIX上避免SEGMENTATION FAULT?

char*比字符数组更受欢迎?

Eam*_*nne 18

特定于C++

  • 避免手动管理存储器,而是使用RAII容器如std::auto_ptr,boost::scoped_ptr,boost::shared_ptr和等效阵列的容器.更简单,通常std::vector工作得很好,并且根本不需要任何指针使用.最后,您可以传递引用,而不是将指针传递给大型或可修改的数据结构.指针可以表示数组,而引用可以避免这种歧义.
  • 索引数组是大多数指针算法的理想替代品.它通常不比指针算术慢,这通常更容易出错并且更难以阅读和维护.通常,不要以可读性为代价进行微优化.
  • 调用正确的释放例程: delete[]仅用于分配的数组,new ...[]delete用于指向单个对象的指针,free(...)仅用于通过C api分配的内存(例如malloc(..)).这些不能混淆; C++释放例程包括析构函数调用,因此需要正确调用.
  • 明确初始化并设置无意义的指针NULL.调试意外的空取消引用比不正确的内存访问更容易.释放NULL指针是可以的,因此您不需要使用检查来破坏析构函数以避免这种情况.如果你delete是一个过早的对象,你应该设置它的指针,NULL以避免双重删除相同的指针,并避免意外解除引用悬空指针.
  • 如果您正在使用C++继承并且正在覆盖析构函数,请阅读虚拟析构函数; 这些是正确性所必需的(简而言之,基类必须明确地将析构函数标记为虚拟).
  • 如果必须手动管理内存,请注意谁"拥有"指针.只有所有者才能释放指针所指向的对象或数组,并且在所有者delete指向它之后,没有其他对象可以使用该对象. boost::shared_ptr是一个无障碍的相当低的开销容器,当你需要共享指针时通常很好.


Fer*_*eak 12

  1. 始终确保您的指针已初始化
  2. 始终知道分配的内存区域的长度
  3. 使用指针时始终检查NULL值
  4. 使用后始终删除指针
  5. 永远不要覆盖指针末端的内存
  6. 永远不要相信为您的方法提供的有效性指针
  7. 永远不要将用户输入放在指针中(例如)
  8. 切勿将malloc/free与new/delete混合使用
  9. 永远不要使用malloc分配指向类对象的指针
  10. 永远不要免费释放类对象指针

最后但并非最不重要

永远不要使用指针,除非你必须...有(const)引用来避免传递给函数和STL容器的对象的复制构造以及其他存储要求的字符串,并且如果你真的需要指针则使用smart(boost :: shared_ptr)指针并且不想手动跟踪它们.


dir*_*tly 2

编写符合标准的代码。那应该照顾平台。还有很多其他问题。并使用const. 这样可以解决更多问题。