我将其设为社区 wiki 是为了更好地理解这些错误与其运行时或编译结果之间的语义差异。另外,我在 Java 上的编码时间太长了,我想在 C++ 中更好地学习指针——所以我需要其他人来做。
Edit2:我正在重构这个问题。我试图得出的区别是,在托管代码上,这些错误都通过异常统一处理。但是,C++ 并不是那么简单——我想了解在每种情况下您是否可能会遇到错误、段错误、可恢复的行为,或者更糟糕的是传播的无声错误。请查看我的新具体示例(是的,我知道答案总是“完全按照编码”;毕竟我是一名程序员。我想知道您经常遇到的有趣细节。)
Edit3:在下文中,“类”是指类的一个实例。谢谢
错误 1:指针值为 NULL,即指针 == 0
- 托管代码:在运行时引发 NullPointerException
- C++:?
- 示例:嗯,呃,你有一个指向类的指针,但它被初始化为 0。当你将它发送到函数时会发生什么。IE。C++ 没有留下任何类的指示;它只是公共“占位符”的串联。
错误 2:指针指向内存中的前一个类,其值为 NULL 或 == 0
- 托管代码:不允许通过内存模型。所有引用的对象都保留在内存中。没有特殊情况?
- C++:?
- 示例:您有一个指向类的指针,并且该类被删除了。然后将指针作为参数传递给函数。显然,出现的问题取决于函数如何处理指向的类。我的问题是:在 STL 上是否有故障安全处理?一个好的专有库?平均开源代码?
错误 3:指针指向的类不属于正确的类或子类
- 托管代码:引发 ClassCastException。
- C++:[如果错误则更正]编译器试图通过不允许错误的强制转换来解决这个问题。但是,如果这发生在运行时,我认为是未定义的行为。是否存在类似的类对象不会总是爆炸的情况?
- 示例:您的指针被错误地重新分配,使其值完全等于另一个类。我假设您将这个引用的类传递给的函数只会盲目地获取它引用的任何实例变量的偏移量。因此,它错误地解释了原始二进制文件。在 C++ 中没有办法防止这种情况发生吗?和/或……有没有这种能力被永远利用的情况?
错误 4:指针指向类中间(未对齐)或未初始化的垃圾
- 托管代码:内存模型不允许。
- C++:相当于案例 3?
- 示例:您实际上经常合法地使用它。例如,您可以直接访问 STL 向量的数组 - 这是指向类的中间。然而,似乎也一样容易“错过”?是否存在一个常见的陷阱,您可能会违背自己的意愿发生这种情况,例如如果加载的库与您链接的库不同(并且是否有防止这种情况发生的机制?)
在此先感谢所有贡献者。