代码之家  ›  专栏  ›  技术社区  ›  anivas

为什么要以混合模式新建本机对象?

  •  1
  • anivas  · 技术社区  · 15 年前

    我有一个C++/CLI(VS 2008)混合模式库,在那时创建本地对象和调用方法。本机dll是用纯c++编写的。现在,在C++ C++ CLI包装方法中,如果我用C++方式声明本地类的对象

    ClassA obj;
    Obj.Method(); 
    

    使用它,它有效,但是,我得到 System.AccessViolationException: Attempt to read or write protected memory

    但如果我这样做

    ClassA *obj = new ClassA();
    Obj->Method();
    

    它工作得很好。 Destructor 在本机代码中声明为虚拟。这就是原因吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

    不,这与堆栈与堆无关。托管程序中的堆栈与本机程序中的堆栈没有区别。在托管程序中使用本机代码并不会降低它破坏堆、跺堆栈帧、覆盖缓冲区末端、调用未定义行为(通常是由于访问冲突导致本机代码崩溃)的可能性。

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

        2
  •  0
  •   Kate Gregory    15 年前

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

    delete obj;
    

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

    推荐文章