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

Posted

技术标签:

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

我已经编写了一个在网络中工作的 Windows 基础程序。

首先我有一个自动完成文本框,它从数据库中读取名称并根据用户输入的字母显示给用户。

程序运行正常,但有时会出现错误

但是

现在我添加了另一个从数据库读取的自动完成文本框,现在第一个自动完成工作正常,但是当我想填充第二个文本框时,它会显示此错误并冻结。

有趣的一点是程序在服务器上运行正常,只在客户端显示这个错误。 即使在我的笔记本电脑或其他笔记本电脑上执行它时也没有任何错误,我将它们与家里的笔记本电脑建立了网络,它只在办公室的客户端计算机上出现错误。

请帮我解决这个问题。

谢谢

完整的异常内容是:

-----Exception Type Is : UnHandled
-----Exceptiotn Message is : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
-----Source that causes this error: System.Windows.Forms
-----StackTrace is : at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason,ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason,ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Project1.Program.Main() in C:\Users\ZY\Documents\Visual Studio 2008\Projects\Project1\Project1\Program.cs:line 25

我的自动完成代码是:

private void txtkhrdsharh_TextChanged(object sender, EventArgs e)
   

            AutoCompleteStringCollection namecollection = new     AutoCompleteStringCollection();
            BLL objbll = new BLL();
            SqlDataReader rea = objbll.SelectSharhlistF(txtkhrdsharh.Text);
            if (rea.HasRows == true)
            
                while (rea.Read())
                    namecollection.Add(rea["sharh"].ToString());
            
            rea.Close();

            txtkhrdsharh.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtkhrdsharh.AutoCompleteSource = AutoCompleteSource.CustomSource;
            txtkhrdsharh.AutoCompleteCustomSource = namecollection;
    

【问题讨论】:

调用所有通灵调试器... “它冻结了”?要么没有足够的硬件,要么你在撒谎。 发生未处理的异常,出现异常对话框,因此程序冻结...很确定这就是意思 当您使用指针时,“尝试读取或写入受保护内存”错误通常发生在本机(即非托管)代码或不安全代码中。你在某处调用非托管代码吗?你在使用不安全的代码/指针吗?异常堆栈跟踪是否为您提供了错误发生位置的任何指示? 正如我所说,当我添加另一个自动完成文本框时会出现此错误,因此它应该与自动完成有关。我在主帖中添加了完整的错误。它说在 program.cs 的第 25 行发生错误:Application.Run(new frm1()); 【参考方案1】:

您的代码非常混乱。每当文本框中的文本发生更改时,您都会修改自动完成设置。为什么要这么做?通常,您会在创建文本框时设置自动完成功能。就目前而言,每次用户按下文本框上的键时,您都会更改设置。

我承认我不知道为什么(或什至是否)会导致程序崩溃,但这至少可能是一个性能问题,并且可能导致一些非常奇怪的行为。

我怀疑你想重新审视你的实现并在表单首次显示时进行自动完成设置。

Windows 消息处理程序中抛出了异常——由您的应用程序运行的消息循环。这不是您编写的代码,可能很难看出错误发生在哪里。

但是,确定错误发生的时间会非常有用。如果您可以在调试器中加载程序并单步执行 TextChanged 事件处理程序,您可能能够确定哪一行代码触发了异常。

【讨论】:

您被问到:但是,确定错误发生的时间非常有用。答案是当我在第一个文本框中输入字母时它没有问题并在自动完成中显示所有名称,但是当我在第二个自动完成文本框中输入字母时出现错误 @PhoenixPhoenix:也许问题根本不在处理程序中。如果您注释掉 TextChanged 处理程序中的代码,是否会出现错误?此外,除非您在调试器中加载程序并单步执行处理程序代码,否则无法提供更多帮助,以便您可以告诉我们哪一行代码触发了异常。 我不明白自动完成代码有什么问题?该代码应按用户输入的每个字母执行,例如名称 JOHN ,首先应在数据库中搜索以 J 开头的名称,然后搜索以 JO 开头的名称,依此类推。错了吗? 主要问题是我的笔记本电脑上没有收到该错误,所以我无法测试它。此错误仅在最终用户机器上产生。它使测试对我来说非常困难【参考方案2】:

我发现了问题。 正如吉姆所说,这与我的自动完成代码有关,该代码通过用户输入的每个字母向服务器发送请求。服务器很弱,无法回答这么多请求。 我将代码更改为下面的代码,问题就解决了。 我把代码放在这里:它可能对第一次想使用自动完成的人(比如我)有用:

               private void frm1_Load(object sender, EventArgs e)
    
            AutoCompleteStringCollection namecollectionF = new AutoCompleteStringCollection();
        BLL objbll1 = new BLL();
        SqlDataReader dReader = objbll1.SelectNamelistF();
        if (dReader.HasRows == true)
        
            while (dReader.Read())

                namecollectionF.Add(dReader["Name"].ToString());

        
        else
        
            MessageBox.Show("Data not found");
        
        dReader.Close();

        txtForooshande.AutoCompleteMode = AutoCompleteMode.Suggest;
        txtForooshande.AutoCompleteSource = AutoCompleteSource.CustomSource;
        txtForooshande.AutoCompleteCustomSource = namecollectionF;
       

【讨论】:

【参考方案3】:

正如@Jim Mischel 所说,它似乎与非托管代码有关。如果您不确定http://msdn.microsoft.com/en-us/library/ms235442(VS.80).aspx,请阅读以下内容并设置 nxcompat 位

【讨论】:

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

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

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

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

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

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

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