我现在用C ++编程,我喜欢使用指针。但似乎其他较新的语言,如Java,C#和Python,不允许您显式声明指针。换句话说,您不能同时编写int x
和int * y
,并且x
是值,而y
是指针,在任何一种语言中。这背后的原因是什么?
答案 0 :(得分:17)
指针不错,它们容易出错。在较新的语言中,他们已经找到了做同样事情的方法,但是用脚射击自己的风险较小。
指针没有错。来吧,爱他们。
对于你的例子,为什么你想要x和y指向同一个内存?为什么不总是把它称为x?
还有一点,指针意味着你必须自己管理内存生命周期。较新的语言更喜欢使用垃圾收集来管理内存,并且允许指针会使该任务变得非常困难。
答案 1 :(得分:12)
I'll start with one of my favorite Scott Meyers quotes:
当我就异常处理进行讨论时,我会教人们两件事:
指针是你的敌人,因为它们会导致
auto_ptr
旨在消除的各种问题。指针是您的朋友,因为对指针的操作无法抛出。
然后我告诉他们度过愉快的一天: - )
关键是指针非常有用,在用C ++编程时理解它们当然是必要的。如果不理解指针,就无法理解C ++内存模型。在实现资源拥有类(例如智能指针)时,需要使用指针,并且可以利用它们的无抛出保证来编写异常安全的资源拥有类。
但是,在编写良好的C ++应用程序代码中,您永远不必使用原始指针。决不。你应该总是使用一些抽象层而不是直接使用指针:
尽可能使用引用而不是指针。引用不能为空,它们使代码更易于理解,更易于编写,也更易于代码审查。
使用智能指针管理您使用的任何指针。 shared_ptr
,auto_ptr
和unique_ptr
等智能指针有助于确保您不会过早泄漏资源或释放资源。
使用标准库中的容器来存储对象集合,而不是自己分配数组。通过使用vector
和map
之类的容器,您可以确保代码是异常安全的(这意味着即使抛出异常,也不会泄漏资源)。
使用容器时使用迭代器。正确使用迭代器要比正确使用指针容易得多,并且许多库实现提供调试支持,帮助您找到错误使用它的位置。
当您使用旧版或第三方API并且绝对必须使用原始指针时,请编写一个类来封装该API的使用情况。
C ++以范围限制资源管理(SBRM,也称为资源获取是初始化,或RAII)的形式进行自动资源管理。用它。如果你没有使用它,那你做错了。
答案 2 :(得分:6)
指针可能被滥用,托管语言更喜欢保护您免受潜在的陷阱。但是,指针肯定不错 - 它们是C和C ++语言的一个不可或缺的特性,没有它们编写C / C ++代码既棘手又麻烦。
答案 3 :(得分:3)
真正的“指针”有两个特征。
通常为指针定义的算术运算是:
托管语言通常会引导您走“引用”而不是指针。引用还包含另一个对象(或基元)的地址,但不允许运算。
除此之外,这意味着您不能使用指针算法离开数组的末尾并使用错误的类型处理其他一些数据。通过使用垃圾收集在这种环境中处理形成无效指针的另一种方式。
这样可以确保类型安全,但是会失去一般性。
答案 4 :(得分:3)
我试着直接回答OP的问题:
换句话说,你不能同时写两个 int x和int * y,并且x为a 值是y,而y是指针 那些语言。是什么原因 在这背后?
这背后的原因是这些语言中的托管内存模型。在C#(或Python,或Java,...)中,资源的生命周期以及内存的使用由底层运行时自动管理,或者由垃圾收集器自动管理。简而言之:应用程序无法控制内存中资源的位置。它没有指定 - 甚至不保证在资源的生命周期内保持不变。因此,指针作为“虚拟或物理内存中某物的位置”的概念是完全不相关的。
答案 5 :(得分:1)
指针还不错。指针很难。您在Java,C#等语言中无法使用int x
和int * y
的原因是,此类语言希望使您摆脱解决编码问题(最终是您的细微错误)的原因,并且他们希望使您更接近为您的项目提供解决方案。他们想给您带来生产力。
就像我之前说的那样,指针还不错,它们只是困难的。在 Hello World 程序中,指针似乎是小菜一碟。然而,当程序开始增长时,管理指针,传递正确的值,计数对象,删除指针等的复杂性开始变得复杂。
现在,从程序员(语言的用户,在本例中为您)的角度来看,这将导致另一个问题,随着时间的流逝,这一问题将变得显而易见:您花费的时间越长阅读代码后,再次理解代码就会变得更加困难(即过去几年,几个月或活动日的项目)。除此之外,有时指针使用不止一层的间接访问(TheClass ** ptr
)。
最后但并非最不重要的一点是,当指针应用程序非常有用时,存在一些主题。正如我之前提到的,还不错。在算法字段中,它们非常有用,因为在数学上下文中,您可以使用简单的指针(即int *
)来引用特定的值,并且更改是值而无需创建另一个对象,讽刺的是,它变成了使用指针而不是不使用指针更容易实现算法。
提醒:每当您问指针或其他东西为什么不好或不好时,请尝试在历史背景下思考何时出现此类主题或技术以及他们试图解决的问题。解决。在这种情况下,需要 pointers 来访问Bell实验室的PDP计算机的内存。
答案 6 :(得分:0)
正如有人提到的那样,如果你有一个庞大的应用程序,指针可能,实际上会出错。这是我们有时看到Windows由于创建了NULL指针而出现问题的原因之一!我个人不喜欢指针,因为它会导致可怕的内存泄漏,无论你如何管理你的记忆,它最终会在某些方面追捕你。在处理图像处理应用程序时,我对OpenCV经历了很多这方面的工作。有很多指针浮动,将它们放在一个列表中然后检索它们会给我带来麻烦。但同样,使用指针有很好的方面,这通常是调整代码的好方法。这一切都取决于你在做什么,你必须满足的规格等等。