尝试读取或写入受保护的内存。这通常表明其他内存已损坏

Posted

技术标签:

【中文标题】尝试读取或写入受保护的内存。这通常表明其他内存已损坏【英文标题】:Attempted to read or write protected memory. This is often an indication that other memory is corrupt 【发布时间】:2011-04-19 02:48:02 【问题描述】:

我有一个客户端通过套接字连接的应用程序。该应用程序是多线程的,会进行大量的数字运算,并消耗大量内存。 (1.5 - 2 GB) 有时它会在看似简单的代码区域引发此错误。

试图读取或写入受保护的内存。这通常表明其他内存已损坏。

它并不总是在同一行,但它总是在同一个文件中,在一个 foreach 循环中。我想知道VS 2008中是否有一些设置会导致它?没有什么奇怪的事情发生,它真的只是死在一个遍历列表的 foreach 循环中。我很确定这不是线程问题,因为我使用的是 lock(),所以我 100% 确定列表不会同时被多个线程修改。我试过关闭编译器优化,但它仍然每隔一段时间就会这样做。很烦人。

这是非常罕见的情况。我在调试中运行服务器,这只会每 12-48 小时发生一次。

【问题讨论】:

我 100% 确定这是线程问题或简单的内存损坏问题。 这是一个纯 c# 应用程序吗?任何/不安全的代码?通过 pinvoke 对 DLL 的任何调用?任何第三方类库 纯c#,没有不安全的代码。没有第三方库。我也会假设线程,但是有问题的代码块是用 lock() 包裹的。列表中的对象可能会被另一个已经有引用的线程修改,但不是列表本身。如果是线程问题,我会假设我也会看到集合修改错误。它真的是一个坏记忆棒吗? 【参考方案1】:

“没有什么奇怪的事情发生了,它真的只是在遍历列表的 foreach 循环中死掉了”。 - 这听起来有点像线程同步问题。 (其实我可以99%保证!)

如果您在迭代列表时有其他线程试图修改它,您可能需要获取该列表的副本。

建议你发布一些代码。

【讨论】:

代码块是用 lock() 包裹的,所以我确定列表会被修改。但是,列表中的对象可能是由已经具有引用的线程提供的。而且它从不抛出集合修改错误,所以如果它是另一个修改列表的线程,我认为也会发生这种情况。

以上是关于尝试读取或写入受保护的内存。这通常表明其他内存已损坏的主要内容,如果未能解决你的问题,请参考以下文章

尝试读取或写入受保护的内存。这通常表明其他内存已损坏

尝试读取或写入受保护的内存。这通常表明其他内存已损坏

尝试读取或写入受保护的内存。这通常表明其他内存已损坏 DllImport

尝试读取或写入受保护的内存。这通常表明 c# 中的其他内存已损坏(访问冲突)

错误:试图读取或写入受保护的内存。这通常表明其他内存已损坏

错误“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”