【问题标题】:Access violation exception when deleting an array删除数组时访问冲突异常
【发布时间】:2013-02-23 13:02:18
【问题描述】:

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

我有一个针对 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.
}

谢谢, 穆达西尔

【问题讨论】:

  • myNativeObj的数据类型是什么?您确定正在调用预期的函数吗?
  • 你在调用myNativeObj-&gt;InitializeArray(myArray);之前初始化myNativeObj了吗
  • 需要SSCCE,代码看起来不错。
  • 你能发布抛出什么异常,以及所有运行时错误消息吗?

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


【解决方案1】:

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

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

【讨论】:

  • +1 搞定了,显然我太关注代码而没有足够关注周围的文本来注意到这个相当重要的细节>_>。也就是说,这就是他们发明 COM 的原因——.NET 只是从先前的经验中获益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多