为什么我应该在混合模式下新建本机对象?

时间:2010-10-22 11:24:22

标签: c++-cli

我有一个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被声明为虚拟。那是什么原因吗?

2 个答案:

答案 0 :(得分:1)

不,这与堆栈与堆无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码不会使它不太可能导致它破坏堆,踩堆栈帧,覆盖缓冲区的末尾,调用未定义的行为,通常的东西使本机代码崩溃与访问冲突。

将它存储在堆栈与堆之间的区别是所造成的损坏。是的,堆损坏可能需要一段时间才能产生副作用。通常比堆栈帧损坏长得多,包括永远不会。

答案 1 :(得分:0)

我的猜测是你的析构函数中有错误。当程序退出时,析构函数会在第一种情况下消失,但不会在第二种情况下消失。你可以通过添加

来测试这个
delete obj;
在你的第二个案例代码中的某个地方,然后踩着调试器看看你是否得到了异常。然后解决你的析构函数中的问题。