2010-11-27 38 views
0

Je suis un débutant pour. Net et en essayant d'utiliser le filetage géré. Je n'ai trouvé aucun problème dans mon code, mais il déclenche une exception lorsque le thread se termine. Quelque chose comme: Exception non gérée à 0x5cbf80ea (msvcr90d.dll) 0xC0000005: violation d'accès en lecture l'emplacement 0x000000d7.Passer un tableau non géré à un thread géré. - corruption de mémoire

#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; 
} 

Cependant, cela fonctionne correctement lorsque j'alloue le tampon en tant que tableau global. Cette exception intervient lorsque j'utilise un mot clé "new", d'où une allocation de mémoire dynamique. Est-ce que je fais des erreurs fondamentales? Est-ce quelque chose à traiter avec le garbage collector? ou Tas non géré alloué par le "nouveau" mot-clé? Je préférerais vraiment avoir ce tampon en tas non géré. Bien que j'écrive un code managé, de nombreuses autres DLL que j'utilise ne sont pas gérées.

Répondre

2
dt = new int(sz); 

Cette alloue un seul entier, (pas un tableau), et initialiser la valeur de sz (100). Ce que vous voulez est le suivant:

dt = new int[sz]; 

Ce alloue un tableau de taille dt. Notez que pour éviter les fuites de mémoire, vous devez le libérer plus tard comme ceci:

delete [] dt; 
+0

Merci beaucoup. C'est vraiment une erreur élémentaire. Le débogueur ne se plaint pas de l'erreur jusqu'à ce que le thread tente de se terminer. VS débogueur n'est pas au courant de ce genre de situations? Je suis surpris que le débogueur ne gère pas bien. – Anniffer