【问题标题】:Precautions while using pointers? [duplicate]使用指针时的注意事项? [复制]
【发布时间】:2023-04-09 16:28:02
【问题描述】:

指针是 C 和 C++ 等编程语言的核心。这同时会导致许多错误和内存泄漏。 在 C 和 C++ 中使用指针时必须注意哪些事项?

【问题讨论】:

  • 这样使用指针不会导致任何内存泄漏。
  • @PawełStawarz - 不,是“许多错误和”导致泄漏。 :-)
  • C/C++ 不是一种语言。它是其中之一。我这样说是因为我喜欢采取的预防措施之一是 RAII 方法并使用与 C 无关的智能指针。否则,请始终在访问之前检查指针是否为空,并在两者中删除后将其设置为空C 和 C++。
  • 在处理指针时出错也不会导致任何内存泄漏。纯指针(没有内存分配)只能导致 UB 并访问未提及的部分内存:)
  • @PawełStawarz:int *a; a = malloc(100); a = NULL; 错误。内存泄漏。

标签: c++ c pointers


【解决方案1】:
  • 始终初始化它们
  • 检查边界(指针偏移量/索引的大小)
  • free完成后的内存
  • 释放后设置为NULL
  • 在访问之前检查他们不是NULL
  • malloc 时,使用thing = malloc(N * sizeof *thing)
  • 不要覆盖在 malloced 之前 free 的指针。
  • ...

【讨论】:

  • 你应该把最后一个改成“不先释放指针就不要覆盖它”
  • 听起来像 c - 不是 c++
  • @DieterLücking - 绝对。这是我隐约理解的"C/C++" 的一半......也是最需要人们注意指针的那个(因为C++ 中有很多很酷的东西在C 中丢失了。因此++ 我想)。
  • 答案涵盖了c 的所有问题,但没有涵盖c++ 甚至部分...
  • @pantarei - 你是对的;我专注于 C 是因为 (a) 我更了解它,并且 (b) 它更容易受到攻击,缺少您指出的许多保护性 C++ 构造。
【解决方案2】:

cmets 和 Floris 的回答中有一些很好的建议,但 IMO “不要使用指针”不是其中之一

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

另外,如果您有一个包含该 shared_ptrs 的容器并且您只是添加但从不从容器中删除,那么 shared_ptrs 不会帮助您。你仍然“泄露”了资源,尽管你并没有失去删除它的能力。


其他杂项提示

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

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

【讨论】:

  • '不要使用指针' 是一个非常愚蠢且过于狭隘的建议!!
  • @πάνταῥεῖ - 我认为 nhed 是在说:“在给出的所有好建议中,‘不要使用指针’不是其中之一”。他继续详细说明这一立场。所以你们两个是一致的,尽管你的评论看起来你认为你不同意。
  • @Floris 这意味着协议。就目前而言,这有点难以获得,是的。
  • @Floris 我没有收到通知,但及时阅读。通常我会在一段时间后查看我自己的 cmets/answers。我不太喜欢从我的智能手机/平板电脑中使用 SO,可能主要是因为复制某些东西要困难得多(我经常将其用于 cmets 或答案)。还有其他缺点,例如如果我使用笔记本电脑或开发机器,编写代码示例对我来说效果更好。
  • @πάνταῥεῖ 确实很难在移动设备上使用该网站;但有时这就是我所拥有的一切......同意你所说的。
【解决方案3】:

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

不一定'指针',我们来谈谈引用......

注意(!)'指针'的角色已经发生了根本性的变化,当涉及到 中使用的范例时(尤其是对于 语言标准)。所以很难平等地处理它们,

至于

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

中,尽可能使用对 不可用的引用(请参阅&&& 运算符),因为它们不能导致'悬空参考' 与 'dangling pointer')。

中引入的原理命名为RAII,主要从存在的任何函数的调用栈范围和执行路径(不管它们是否在同一个线程中调用)来管理任何类实例的生命周期)。我并不是说不能仅使用普通的 来实现,但它更困难且容易出错。

在 c++ 应用程序中,应使用 smart pointer facilitiess 或至少使用旧的(同时已弃用)std::auto_ptr 类来对堆分配的类实例进行适当的内存管理,例如pre c++11 标准。

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

当然,在 c++ 中使用 原始指针 有一些用例(尤其是在 c 和 c++ API 之间的接口时),但是您应该始终测试它们的有效性并非常清楚您的'实际上在做! c++ 标准很好地涵盖了所有其他情况,您只需要使用正确的标准智能指针类即可摆脱您的问题。

【讨论】:

  • 这个答案很容易混淆
  • @DieterLücking 是吗?我希望喜欢来改进它,因为我发现cc++ 中推荐的引用处理方式存在一些差异。您能否详细说明需要改进的具体点(对于c++ 方面,我一开始就提到了)。
  • @DieterLücking ...随时编辑以进行改进! (未能在 5 分钟限制内编辑上述评论)
  • @DieterLücking 另外一点:(tag:c 和 tag:c++) 指针的混淆 以及如何正确使用它们无处不在(抱歉,我没有关于这一点的一般答案)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2018-04-22
  • 2010-10-25
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多