指针坏了吗?

wro*_*ame 14 c++ pointers

我现在用C++编程,我喜欢使用指针.但似乎其他较新的语言,如Java,C#和Python,不允许您显式声明指针.换句话说,你可以不写都int xint * y,并具有x同时是一个值y是一个指针,在任何一种语言.这背后的原因是什么?

Ste*_*owe 18

指针也不错,它们很容易出错.在较新的语言中,他们已经找到了做同样事情的方法,但是用脚射击自己的风险较小.

指针没有错.来吧,爱他们.

对于您的示例,为什么您希望x和y指向同一个内存?为什么不总是称它为x?

还有一点,指针意味着你必须自己管理内存生命周期.较新的语言更喜欢使用垃圾收集来管理内存,并且允许指针会使该任务变得非常困难.

  • "指针意味着你必须自己管理内存生命周期"这是关于C++的最广泛和最令人沮丧的误解之一.你可以**手动管理动态分配的对象生命周期,但是你没有**(大多数时候你绝对不应该).智能指针和容器等设施可用于确保自动生命周期管理.仅考虑生命周期管理,这种方法实际上比垃圾收集更好,因为生命周期也是确定性的. (13认同)
  • 当然,没有任何好处是免费的.C++指针是强大而危险的,而在某些其他语言中,虽然你不能用脚射击自己,但你很难瞄准.从更高级语言处理可应用于C++的指针的方法中可以学到一些东西. (12认同)
  • @GMan:即使在GC语言中,为了摆脱子对象,你必须将父对象中的指针设置为null.有很多框架(特别是GUI框架)容易泄漏,正是出于这个原因.在框架的某个地方,一个指针存活,并且整个互连对象集被泄露. (5认同)
  • @Steve:那么当你使用GC时,它仍然是*你*管理内存因为*你*是确保你使用GC语言的那个? (3认同)

Jam*_*lis 12

我将从我最喜欢的Scott Meyers引用之一开始:

当我就异常处理进行讨论时,我会教人们两件事:

  • 指针是你的敌人,因为它们导致了auto_ptr旨在消除的各种问题.

  • 指针是你的朋友,因为对指针的操作不能抛出.

然后我告诉他们祝你有个美好的一天:-)


关键是指针非常有用,在用C++编程时理解它们当然是必要的.如果不理解指针,就无法理解C++内存模型.当您实现一个资源拥有类(例如智能指针)时,您需要使用指针,并且您可以利用它们的无抛出保证来编写异常安全的资源拥有类.

但是,在编写良好的C++应用程序代码中,您永远不必使用原始指针.决不.你应该总是使用一些抽象层而不是直接使用指针:

  • 尽可能使用引用而不是指针.引用不能为空,它们使代码更易于理解,更易于编写,并且更易于代码审查.

  • 使用智能指针来管理您使用的任何指针.智能指针一样shared_ptr,auto_ptrunique_ptr帮助,以确保您不会泄漏资源或空闲资源过早.

  • 使用标准库中的容器来存储对象集合,而不是自己分配数组.通过使用类似vector和的容器map,您可以确保您的代码是异常安全的(这意味着即使抛出异常,您也不会泄漏资源).

  • 使用容器时使用迭代器.正确使用迭代器要比正确使用指针容易得多,并且许多库实现提供调试支持,帮助您找到错误使用它们的位置.

  • 当您使用旧版或第三方API并且绝对必须使用原始指针时,请编写一个类来封装该API的使用.

C++以Scope-Bound Resource Management(SBRM,也称为Resource Acquisition is Initialization,或RAII)的形式进行自动资源管理.用它.如果你没有使用它,你做错了.

  • @Paul:您的代码段的行为未定义."在一个定义良好的程序中不能存在空引用,因为创建这样一个引用的唯一方法是将它绑定到通过解除引用空指针获得的"对象",这会导致未定义的行为"(C++ 03 8.3 0.2/4). (8认同)
  • @Paul:错了.在C++中,你如何得出结论:引用无效?你不能,因为在一个定义良好的程序中,你*永远不会*有一个错误的引用.当你说这是可能的时候你会打败自己,因为你不能再可靠地观察你的程序状态,这是结束引用无效的必要条件.(换句话说,问题在于调用UB的人,而不是引用.引用不能为null;可以输入UB.) (4认同)

Ebo*_*ike 6

指针可能被滥用,管理语言更喜欢保护您免受潜在的陷阱.但是,指针肯定不错 - 它们是C和C++语言不可或缺的特性,而没有它们编写C/C++代码既棘手又麻烦.