【问题标题】:Passing unmanaged array to a Managed Thread. - memory corruption将非托管数组传递给托管线程。 - 内存损坏
【发布时间】:2011-05-16 15:21:45
【问题描述】:

我是 .Net 的新手,正在尝试使用托管线程。 我在我的代码中找不到任何问题,但是当线程结束时它会触发异常。 就像是: 0x5cbf80ea (msvcr90d.dll) 处未处理的异常 0xC0000005:访问冲突读取位置0x000000d7。

#include "stdafx.h"

using namespace System;
using namespace System::Threading;

#define sz 100

//int dt[sz]; //allcating a gloal buffer
int *dt;


void workerThread (void)
{
    Console::WriteLine("Producer Thread Started!");
    int data = 50;
    for(int i=0; i<sz; i++)
    {
        Thread::Sleep(1);
        dt[i] = i;
        Console::WriteLine("Producer W={0}", i);
    };
    Console::WriteLine("Producer Thread Ending");
}

int main(array<System::String ^> ^args)
{
    Console::WriteLine("This is a test on global variable and threading");
    //allcating a buffer
    dt = new int(sz);

    Thread ^wthrd = gcnew Thread(gcnew ThreadStart(&workerThread));
    //Starting Worker Thread..
    wthrd->Start(); 
    //Waiting for Worker Thread to end.
    wthrd->Join();  
    Console::WriteLine("Worker Thread Ended.");
    Console::ReadKey();
    return 0;
}

但是,当我将缓冲区分配为全局数组时,它可以正常工作。当我使用“new”关键字时会出现此异常,因此是动态内存分配。 我犯了任何根本性的错误吗? 这是要处理垃圾收集器的事情吗?还是由“new”关键字分配的非托管堆? 我真的更喜欢在非托管堆中有这个缓冲区。虽然我正在编写托管代码,但我使用的许多其他 DLL 都是非托管的。

【问题讨论】:

    标签: multithreading heap-memory unmanaged managed heap-corruption


    【解决方案1】:
    dt = new int(sz);
    

    这是分配一个单个整数(不是数组),并用sz (100) 的值对其进行初始化。你想要的是这样的:

    dt = new int[sz];
    

    这会分配一个大小为dt数组。请注意,为了避免内存泄漏,您必须稍后像这样释放它:

    delete [] dt;
    

    【讨论】:

    • 非常感谢。这确实是一个基本的错误。在线程尝试结束之前,调试器不会抱怨错误。 VS调试器不知道这种情况?我很惊讶调试器不能很好地处理这个问题。
    猜你喜欢
    • 2010-09-08
    • 2011-02-27
    • 1970-01-01
    • 2011-07-12
    • 2011-09-15
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多