在C ++ DLL和Cpp / CLI控制台项目之间传输对象的向量

时间:2009-02-04 02:25:30

标签: c++ c++-cli interop

我有一个与C ++服务器对话的C ++库应用程序,我正在创建自定义类对象的向量。但是当我尝试返回自定义类obj向量时,我的Cpp / CLI控制台应用程序(与本机C ++交互)会引发内存冲突错误。

代码示例 -

在我的原生C ++课程中 -

std::vector<a> GetStuff(int x)
{
   -- do stuff
   std::vector<a> vec;
   A a;
   vec.push_back(a);
--- push more A objs
   return vec;
}

在我的Cpp / CLI类

public void doStuff()
{
   std::vector<a> vec;
   vec = m_nativeCpp->GetStuff(4);   // where nativeCpp is a dynamically allocated class in nativecpp DLL, the app throws up a memory violation error here!
}

确切的错误消息

  

CLIConsole.exe中发生了未处理的“System.AccessViolationException”类型异常 - 这是我的控制台cpp / CLI项目

     

附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

3 个答案:

答案 0 :(得分:2)

看看this support article。我认为正在发生的事情是你的CLI中的向量试图从DLL访问内部向量数据而由于不同的静态变量而无法这样做。我想唯一好的解决方案是通过DLL边界传递简单数组,&vector[0]返回它。

但是在A类拷贝构造函数中可能还会发生一些神奇的事情。如果他们缺少并且类有指针作为成员,你很容易得到相同的错误。

答案 1 :(得分:2)

我假设本机代码位于单独编译的单元中,如.dll。首先担心的是使用不同分配器(new / delete)的本机代码,当用/ MT编译或链接到另一个版本的CRT时,你会得到它。

接下来要担心的是STL迭代器调试。您应该确保使用_HAS_ITERATOR_DEBUGGING的相同设置编译两个模块。如果本机代码是使用旧版本的CRT构建的,那么它们就不一样了。发布模式构建。

答案 2 :(得分:0)

我不确定,但这可能有效:不是返回一个向量,而是在堆上创建向量并返回指向它的指针。