我有一个与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项目
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
答案 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)
我不确定,但这可能有效:不是返回一个向量,而是在堆上创建向量并返回指向它的指针。