Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli 为什么要在混合模式下创建新的本机对象?_C++ Cli - Fatal编程技术网

C++ cli 为什么要在混合模式下创建新的本机对象?

C++ cli 为什么要在混合模式下创建新的本机对象?,c++-cli,C++ Cli,我有一个C++/CLI(VS 2008)混合模式库,它创建本机对象并在其中调用方法。本地DLL是用纯C++编写的。现在,在C++中,如果我将C++类中的原生类对象声明为 ClassA obj; Obj.Method(); 使用它,它可以工作,但是,我得到System.AccessViolationException:当程序存在时,尝试读取或写入受保护的内存 但是如果我这样做的话 ClassA *obj = new ClassA(); Obj->Method(); 它很好用。 所以我的

我有一个C++/CLI(VS 2008)混合模式库,它创建本机对象并在其中调用方法。本地DLL是用纯C++编写的。现在,在C++中,如果我将C++类中的原生类对象声明为

ClassA obj;
Obj.Method(); 
使用它,它可以工作,但是,我得到
System.AccessViolationException:当程序存在时,尝试读取或写入受保护的内存

但是如果我这样做的话

ClassA *obj = new ClassA();
Obj->Method();
它很好用。 所以我的问题是为什么我不能用C++的方式声明一个对象?
本机代码中的析构函数被声明为虚拟。这就是原因吗?

我猜你的析构函数有错误。当程序退出时,析构函数在第一种情况下启动,但在第二种情况下不启动。您可以通过添加

delete obj;

在第二个案例代码中的某个地方,使用调试器查看是否出现异常。然后解决析构函数中的问题。

我猜析构函数中有错误。当程序退出时,析构函数在第一种情况下启动,但在第二种情况下不启动。您可以通过添加

delete obj;

在第二个案例代码中的某个地方,使用调试器查看是否出现异常。然后在析构函数中解决问题。

不,这与堆栈与堆无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码并不会降低导致本机代码破坏堆、踩踏堆栈帧、覆盖缓冲区结尾、调用未定义行为的可能性,这些通常会导致本机代码因访问冲突而崩溃


将其存储在堆栈和堆上的区别在于所造成的损坏类型。是的,堆损坏可能需要一段时间才能产生副作用。通常比堆栈帧损坏要长得多,包括从不。不,这与堆栈与堆无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码并不会降低导致本机代码破坏堆、踩踏堆栈帧、覆盖缓冲区结尾、调用未定义行为的可能性,这些通常会导致本机代码因访问冲突而崩溃


将其存储在堆栈和堆上的区别在于所造成的损坏类型。是的,堆损坏可能需要一段时间才能产生副作用。通常比堆栈帧损坏要长得多,包括never。

我试过从这个角度调试debugginb,delete对第二种情况有效。调用析构函数ding不会产生任何错误。我还编写了一个本机示例来测试它。我从这个角度尝试了debugginb,第二种情况下delete可以工作。调用析构函数dint会产生任何错误。我还编写了一个本地示例来测试它。