Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Java和C中的内存管理有何不同?_C#_Java_Memory Management_Buffer Overflow - Fatal编程技术网

C# Java和C中的内存管理有何不同?

C# Java和C中的内存管理有何不同?,c#,java,memory-management,buffer-overflow,C#,Java,Memory Management,Buffer Overflow,我正在通读,其中一个条目是为。它建议使用具有功能的语言来防止或缓解此问题,并表示: 例如,许多语言 执行自己的内存管理, 例如Java和Perl,都不是主题 缓冲区溢出。其他语言, 例如Ada和C#,通常提供 溢出保护,但 保护功能可以通过以下方式禁用: 程序员 我不知道Java和C在内存管理方面有任何有意义的不同。为什么Java不受缓冲区溢出的影响,而C#只保护不受溢出的影响?如何在C#中禁用此保护?java不支持原始指针(严格来说,它不支持指针算法) 在C#中,您可以使用、和非托管内存,这使

我正在通读,其中一个条目是为。它建议使用具有功能的语言来防止或缓解此问题,并表示:

例如,许多语言 执行自己的内存管理, 例如Java和Perl,都不是主题 缓冲区溢出。其他语言, 例如Ada和C#,通常提供 溢出保护,但 保护功能可以通过以下方式禁用: 程序员


我不知道Java和C在内存管理方面有任何有意义的不同。为什么Java不受缓冲区溢出的影响,而C#只保护不受溢出的影响?如何在C#中禁用此保护?

java不支持原始指针(严格来说,它不支持指针算法)

在C#中,您可以使用、和非托管内存,这使得缓冲区溢出成为可能。请参阅关键字

为了维护类型安全和安保, C#不支持指针 默认情况下是算术。但是, 使用不安全关键字,您可以 定义一个不安全的上下文,其中 可以使用指针。更多 有关指针的信息,请参阅 话题


回答得好。我想补充一点,Java依赖于堆栈或堆内存位置的使用。C#也一样。使用原始指针的想法是对C#的一种补充,它来自于C代码的背景。虽然C和C/C++是不一样的代码语言,但它们确实有一些共同的语义。使用“不安全”代码的想法允许您避免将大型对象保留在堆上,因为每个运行时实例(对于C#per CLR,对于Java per JVM实例)的内存限制在2GB左右,而不会由于垃圾收集而导致性能急剧下降。在某些情况下,您可以使用C#的能力来利用不安全或手动管理的内存指针,以避免出现诸如堆外缓存等问题的第三方工具数量不足的事实

我要提醒您,如果您确实使用了不安全的代码,请务必熟悉“一次性类型”和“终结器”。这可能是一个相当高级的实践,不正确处理对象的后果与C代码相同。。。可怕的内存泄漏。影响是你的应用程序内存不足,并且它掉了下来(不好)。这就是为什么C#在默认情况下不允许它,并且您需要用“unsafe”关键字覆盖手动控制指针的任何用法。这确保了任何手动处理的内存都是有意的。在处理“不安全”关键字时,戴上C代码帽

Andrew Troelsen在“Pro C#2010和.Net平台”中的“理解对象生命周期”一章中提到了这一点。如果您喜欢在线参考,请访问MSDN网站


最后一点注意:非托管内存在对象(~ObjectName(){…})的终结器部分释放。这些模式确实会增加性能开销,因此,如果您处理的是较低延迟的场景,那么最好让对象保持轻量级。如果你正在处理人类反应,那么你应该在绝对必要的时候考虑这个问题。 +1程序员的观点是,通过使用
safe
关键字禁用保护。还值得注意It管理员视角,即您可以通过安全策略防止应用程序禁用保护。