Передача неуправляемого массива в управляемый поток. - повреждение памяти - PullRequest
0 голосов
/ 27 ноября 2010

Я новичок в .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, которыми я пользуюсь, неуправляемы.

1 Ответ

2 голосов
/ 27 ноября 2010
dt = new int(sz);

Это выделяет одно целое число ( не массив) и инициализирует его значением sz (100). То, что вы хотите, это:

dt = new int[sz];

Это выделяет массив размера dt. Обратите внимание, что во избежание утечки памяти вы должны позже освободить ее следующим образом:

delete [] dt;
...