2

我有一个与 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 项目

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

4

3 回答 3

2

看看这篇支持文章。我认为发生的事情是您在 CLI 中的向量尝试从 DLL 访问内部向量数据,但由于不同的静态变量而未能这样做。我想唯一好的解决方案是通过 DLL 边界传递简单的数组,&vector[0]然后返回它。

但是在 A 类的复制构造函数中可能还会发生一些神奇的事情。如果它们丢失并且类有指针作为成员,您很容易得到相同的错误。

于 2009-02-04T03:30:48.797 回答
2

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

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

于 2009-02-04T22:03:06.617 回答
0

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

于 2009-02-04T02:41:19.583 回答