2010-10-22 57 views
1

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

回答

1

不,这与stack vs heap无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码不会导致它破坏堆,压缩堆栈框架,覆盖缓冲区的末尾,调用未定义的行为,这是使本机代码崩溃的常见原因违反。

将它存储在堆栈中与堆中的区别在于所做的损害类型。是的,堆腐败可能需要一段时间才会产生副作用。通常远比堆栈帧腐败更长,包括永远不会。

0

我的猜测是你的析构函数有一个错误。当程序退出时,析构函数在第一种情况下熄灭,但不在第二种情况下。你可以在你的第二个案例码的地方加入

delete obj; 

,并与调试器步进看到,如果你得到的异常进行测试。然后在你的析构函数中解决这个问题。

+0

我在那个角度尝试了debugginb,删除了第二种情况。并调用析构函数创建任何错误。我也写了一个本地样本来测试它。 – anivas 2010-10-22 11:30:07

相关问题