我有一个C ++ / CLI(VS 2008)混合模式库,可以创建本机对象并调用方法。原生dll是用纯c ++编写的。现在,在我的C ++ / CLI包装器方法中,如果我以c ++方式将本机类的对象声明为
ClassA obj;
Obj.Method();
并使用它,它可以工作但是,当程序存在时,我得到System.AccessViolationException: Attempt to read or write protected memory
。
但如果我这样做的话
ClassA *obj = new ClassA();
Obj->Method();
它工作正常。
所以我的问题是为什么我不能在C ++方式的堆栈上声明一个对象?
本机代码中的Destructor
被声明为虚拟。那是什么原因吗?
答案 0 :(得分:1)
不,这与堆栈与堆无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码不会使它不太可能导致它破坏堆,踩堆栈帧,覆盖缓冲区的末尾,调用未定义的行为,通常的东西使本机代码崩溃与访问冲突。
将它存储在堆栈与堆之间的区别是所造成的损坏。是的,堆损坏可能需要一段时间才能产生副作用。通常比堆栈帧损坏长得多,包括永远不会。
答案 1 :(得分:0)
我的猜测是你的析构函数中有错误。当程序退出时,析构函数会在第一种情况下消失,但不会在第二种情况下消失。你可以通过添加
来测试这个delete obj;
在你的第二个案例代码中的某个地方,然后踩着调试器看看你是否得到了异常。然后解决你的析构函数中的问题。