Precautions while using pointers?
指针是编程语言的核心,如C语言和C++语言。这同时会导致许多错误和内存泄漏。在C和C++中使用指针时必须采取哪些预防措施?
- 这样使用指针不会导致任何内存泄漏。
- @ Pawe?不,是"许多错误和"导致了泄漏。-)
- C/C++不是一种语言。这是其中之一。我这么说是因为我喜欢采取的预防措施之一是RAII方法,并使用与C无关的智能指针。否则,在C和C++删除后,总是检查指针是否为空,然后将其设置为空。
- 处理指针时出错也不会导致任何内存泄漏。纯指针(没有内存断开)只能导致UB并访问不符合以下条件的内存部分:
- @ Pawe?Stawarz:int *a; a = malloc(100); a = NULL; 错误。内存泄漏。
- 在C++中,只需避免指针(或者将它们封装在一个类或一些SydDypTr/UnQuyJ-PTR)中。
- @Floris这个例子做内存分配。如果不手动分配内存(因此-不使用malloc、realloc、new等),指针本身就不会导致内存泄漏。
- @ Pawe?Stawarz是指针操作a=NULL;导致内存泄漏。但我认为我们正在分道扬镳。"枪不会杀人,有枪的人会杀人"。
- 看看侧边栏中引用的许多资源。
- 我不认为它是C++中的一个大问题。C是的,你实际上需要考虑很多,并且要小心。在C++中,只要你了解系统的所有权语义,它就非常自动化,并且有更好的垃圾收集版本(动态对象的确定性清理)。这里的问题是我们仍然有人教C++作为一个更好的C版本而不是它自己的独立语言。
- 如果你想对C或C++有答案,请屏蔽你的决定。有根本性的区别(至少是由双方同意)!
- 不知道这个问题对被引用的人来说是怎样的一个骗局(答案里写的和这里已经得到的相比简直是一派胡言!!!)
- 指点真的不难。您需要采取的唯一真正预防措施是花一些时间来理解它们,并获得一个像valgrind这样的好的内存调试工具,然后您就可以设置了。
- @paulgriffiths-极好的建议"使用一个好的内存调试工具"。
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++标准所覆盖,你只需要使用正确的标准智能指针类就可以从你的问题中解脱出来。
- 这个答案显然很困惑
- @迪特尔&252;是吗?我想改进它,因为我看到在C和C++中推荐的处理方法的差异。你能详细说明哪些方面要改进吗?(对于C++方面,我一开始就提到过)。
- @迪特尔&252;正在检查…请随意编辑以进行改进!(没有在5分钟的限制内编辑以上评论)
- @ DeTeLe&Y.252;CKIG和另一点:(标记:C和TAG:C++)指针的混乱以及如何正确使用指针是普遍存在的(对不起,我对此没有一个一般的答案)!
在评论和Floris的回答中有一些很好的建议,但是我的"不要使用指针"不是其中之一
共享资源对于防止泄漏非常有用,但您不能总是使用它们。例如,您不应该将它们与boost::侵入性容器一起使用。
另外,如果您有一个包含所述共享指针的容器,并且您只是添加但从不从该容器中移除,那么共享指针将不会对您有所帮助。你仍然"泄漏"资源,尽管你没有失去删除它的能力。
其他杂项提示:
与所有资源一样,我发现最好将分配和释放一种类型的代码路径最小化,以便在审阅和/或检测中匹配它们。
在分配C字符串时,不要忘记为终止符预留空间。
- "不要使用指针"是一个非常愚蠢的,而且太过狭隘的建议!!
- @π?ε?ε?-我认为NHED是在说:"在所有给出的好建议中,‘不要使用指针’不是其中之一。"他继续详细阐述这个立场。所以你们两个是一致的,尽管你们的评论让人觉得你们不同意。
- 加上一个用于"最小化分配/释放的代码路径"。保持这些东西的组织对于限制bug的潜入方式非常有帮助。如果你真的隐藏了你在C++领域发现的机制…
- @弗洛里斯,这是为了达成协议。事实上,这有点难,是的。
- @π?ε?ε?-好的,谢谢你的澄清!问题:使用移动网站时,如何在答复中标记您?我没有得到自动完成提示,也不确定@pantarei是否会被正确地翻译并映射到π?ε?ε?通知服务。思想?请参阅我在回答下面的评论(通过电话写的)。不知道你是否收到通知…
- @Floris我没有收到通知,但及时阅读。通常,我会在一段时间后重新查看自己的评论/答案。我不喜欢在我的智能手机/平板电脑上如此频繁地使用它,可能主要是因为它很难复制某些东西(我经常使用这些东西来评论或回答)。还有其他的缺点,例如,如果我在使用我的笔记本电脑或开发机器,编写代码示例对我来说效果更好。
- @π?ε?ε?确实很难在手机上使用这个网站,但有时这就是我的全部…同意你所说的一切。
- 是的,我们达成了暴力协议,对不起,我一整天都没这么做。也不知道如何编辑和使其更清晰。
- 总是初始化它们
- 检查边界(指针偏移/索引的大小)
- free完成后的内存
- 释放后设置为NULL。
- 在访问之前检查它们是否为NULL。
- 当你malloc时,使用thing = malloc(N * sizeof *thing)。
- 不要覆盖在free之前的malloced指针。
- …
- 您应该将最后一个更改为"不先释放指针就不要覆盖指针"
- @BWG-你明白了。
- 听起来像是C而不是C++
- @Dieterl&252;cking-当然。我模糊地理解的是江户十一〔0〕的一半……还有一个最需要人们注意的指针(因为C++中有很多很酷的东西在C.丢失了,所以我假设EDCOX1是1)。
- 答案涵盖了C的所有好,但不包括C++甚至部分…
- PANTARI——你是对的,我把注意力集中在C上,因为(a)我知道它更好,而且(b)它更脆弱,缺少很多你所指出的保护性C++结构。