我是.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都是不受管理的。
答案 0 :(得分:2)
dt = new int(sz);
这是分配单个整数,(不一个数组),并使用sz
(100)的值初始化它。你想要的是这个:
dt = new int[sz];
这会分配大小为dt
的数组。请注意,为了避免内存泄漏,您必须稍后将其释放:
delete [] dt;