删除阵列时出现访问冲突异常

时间:2013-03-08 03:39:32

标签: c++ memory-management c++-cli access-violation

删除分配的内存时,我收到“访问冲突读取位置”异常,如下所示。

我有一个针对Visual Studio 2010(工具集:v100)C ++编译器编译的本机dll。我有一个托管的dll包装器,它是针对工具集v90编译的,因为我想以.net 2.0为目标。

托管包装器将对指针(double *& myArray)的引用传递给本机dll函数调用之一,该调用在内部创建动态数组并初始化数据。

但是,当托管包装器尝试通过调用delete [] myArray来释放包装器时,它会抛出异常。它似乎工作正常如果我要求本机dll释放它。

是否因为受保护的本机DLL地址空间而导致异常?如果我使用v90工具集编译本机dll,则包装器似乎删除了数组,没有任何异常,这很奇怪。

在这种用例中删除内存的最佳方法是什么?

//Managed.cpp
void InitializeData()
{
    double *myArray;
    myNativeObj->InitializeArray(myArray);
    delete[] myArray; // <-- Exception here
}

//UnManaged.cpp
void InitializeArray(double *& myArray)
{
    myArray = new double[get_length()];
    //Initialize data to my array.
}

谢谢, Mudassir

1 个答案:

答案 0 :(得分:4)

您在一个C ++运行时(v100)中分配并在另一个(v90)中释放;那只是在惹麻烦。

您应该在调用delete[]的同一个DLL中调用new[](或者至少从另一个使用相同运行时库的DLL中调用)。这是复杂而混乱的吗?是;这就是COM(以及.NET)发明的原因。