나는 .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"키워드로 할당 된 관리되지 않는 힙? 관리되지 않는 힙에이 버퍼가있는 것을 선호합니다. 관리되는 코드를 작성하고 있지만 사용중인 다른 많은 DLL은 관리되지 않습니다.
고맙습니다. 정말 초등학교 실수입니다. 디버거는 스레드가 끝내기 전까지는 실수에 대해 불평하지 않습니다. VS 디버거는 이러한 종류의 상황을 인식하지 못합니까? 디버거가이 문제를 제대로 처리하지 못해서 놀랍습니다. – Anniffer