2010-11-27 8 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; 
} 

しかし、グローバルアレイとしてバッファを割り当てるとうまく動作します。この例外は、「新しい」キーワード、つまり動的なメモリ割り当てを使用した場合に発生します。 私は何か基本的な間違いを犯していますか? これはガベージコレクタを処理するものですか?または "新しい"キーワードによって割り当てられたアンマネージド・ヒープ? アンマネージヒープにこのバッファを置くのが本当に好きです。私はマネージコードを書いていますが、私が使用している他の多くのDLLはアンマネージドです。

答えて

2
dt = new int(sz); 

これは単一整数を割り当てて、(ないアレイ)、及びsz(100)の値とを初期化します。何がしたいことはこれです:

dt = new int[sz]; 

これはサイズdt配列を割り当てます。メモリがリークするのを防ぐには、後でこのように解放する必要があります。

delete [] dt; 
+0

ありがとうございます。それは本当に基本的な間違いです。 スレッドが終了しようとするまで、デバッガは間違いについては不平を言っていません。 VSデバッガはこのような状況を認識していませんか?私はデバッガがこれをうまく扱えないことに驚いています。 – Anniffer

関連する問題