繁体   English   中英

Java对C ++的指针模型

[英]Pointer Model that Java has over C++

Java和C / C ++之间最大的区别在于Java有一个指针模型,可以消除覆盖内存和破坏数据的可能性。

这是教科书的引用。 我一直认为使用指针而不是Java是C ++。 有人可以详细说明吗?

我反对在描述Java程序时使用“指针”这个词。 我总是说“对象引用”(或仅仅是“引用”)。

C或C ++中的指针标识进程虚拟地址空间中的位置,虚拟地址空间基本上是一个巨大的无类型数组。 给定一个指针,您可以为它添加一个偏移量,并获得指向数组中不同位置的指针。 给定两个指针,您可以计算它们之间的偏移量。

您无法使用Java对象引用执行任何操作。 Java对象引用标识堆上的对象 该对象的地址可以(并且可能确实)不时地改变,但它的身份始终是唯一的。

您不能“向对象引用添加偏移量”并获取不同的对象引用。 它没有任何意义。

他们都使用指针

在C ++中,指针是实际的内存地址,这意味着您可以使用一个(通过指针算术)来识别任意内存位置。

在Java中,指针是不透明的 :知道一个指针的值不会为您提供除指向的对象以外的任何信息。

C ++使用指针/引用,程序员有责任获取和释放动态内存分配。 Java也在内部进行,但为了跟踪内存,java使用引用计数,这是最简单的垃圾收集器! Java隐藏了程序员的指针,C ++并没有因此使C ++变得更加强大,但也很危险。 使用Java,您无法在堆栈上分配用户定义的对象(只有基本类型,如int ...),但在C ++中,您可以使用new关键字在堆上或堆栈上分配用户定义的对象。

Javas“参考系统”是它的指针系统。 它们基本上是指针,没有可能转换为不兼容的类型。 它也不允许你使用指针算术和C和C ++一样。 在C ++中,您可以通过以下方式破坏您的数据:

class SomeClass {
private:
    int a;
public:
    SomeClass(int a): a(a) {}
};

稍后你可以通过基本上这样做来破坏类的对象:

SomeClass victim(2);
unsigned char *hazardousPointer = (unsigned char *) &victim;
for (int i = 0; i < sizeof(SomeClass); i++)
    hazardousPointer[i] = 0;

这段代码只允许我们违反private访问权限并允许更改其状态(它也可以是const ,这无关紧要)。 发生这种情况的原因是,C / C ++指针只是内存地址,它们的行为几乎与整数有一些限制。 此外, hazardousPointer[i]只是*(hazardousPointer + i) C / C ++语法糖,而Java则不是这种情况,其中数组是甚至可以从方法返回并拥有自己的方法的对象。

此外,Java有一个垃圾收集器,它关心内存泄漏,其中C ++依赖于它的系统堆栈和包装器或智能指针

在java中,一切都是引用。 因此,您可以创建一个变量的多个别名,如果您更新其中的任何一个,它将反映在所有别名变量中。

另一方面,C ++有指针和引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM