2010-11-27 3 views
0

나는 .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은 관리되지 않습니다.

답변

2
dt = new int(sz); 

이것은 단일 정수를 할당하고, (하지 배열)과 sz (100)의 값으로 초기화. 당신이 원하는 것은 이것이다 :

dt = new int[sz]; 

이 크기 dt배열를 할당합니다. 메모리 누출을 방지하려면 나중에 다음과 같이 해제해야합니다.

delete [] dt; 
+0

고맙습니다. 정말 초등학교 실수입니다. 디버거는 스레드가 끝내기 전까지는 실수에 대해 불평하지 않습니다. VS 디버거는 이러한 종류의 상황을 인식하지 못합니까? 디버거가이 문제를 제대로 처리하지 못해서 놀랍습니다. – Anniffer

관련 문제