C++ 中的智能指针 - C# 接口

Smart pointers in C++ - C# interface

我正在构建要从 C# 程序调用的 C++ 接口(使用 Dllimport/dll 导出)。 我需要在工作期间使用一些指针。因此导致我创建一个 (create_engine) 方法和 (destroy_engine) 方法。有没有办法使用智能指针,这样我就不再需要 destroy 方法了。

代码:

 extern "C" _declspec (dllexport) Engine* create_engine(){
        return new Engine();
    }


    extern "C" _declspec (dllexport) void destroy_engine(Engine* engine){
        if (engine != NULL){
            delete engine;
        }
        engine = NULL;
    }

P.S。智能指针将从 C# 中使用,因此它应该继续计算 C# 部分中有多少引用...... 谢谢

不,你不能这样做。半手动半自动内存管理不是一种选择。

您最接近的想法是包装 C++ class 以供 C# 使用,并使用 shared_ptr 来管理内存。示例在 MSDN 上(下面的代码也取自那里):Wrap Native Class for Use by C#

// wrap_native_class_for_mgd_consumption.cpp
// compile with: /clr /LD
#include <windows.h>
#include <vcclr.h>
#using <System.dll>

using namespace System;

class UnmanagedClass {
public:
   LPCWSTR GetPropertyA() { return 0; }
   void MethodB( LPCWSTR ) {}
};

public ref class ManagedClass {
public:
   // Allocate the native object on the C++ Heap via a constructor
   ManagedClass() : m_Impl( new UnmanagedClass ) {}

   // Deallocate the native object on a destructor
   ~ManagedClass() {
      delete m_Impl;
   }

protected:
   // Deallocate the native object on the finalizer just in case no destructor is called
   !ManagedClass() {
      delete m_Impl;
   }

public:
   property String ^  get_PropertyA {
      String ^ get() {
         return gcnew String( m_Impl->GetPropertyA());
      }
   }

   void MethodB( String ^ theString ) {
      pin_ptr<const WCHAR> str = PtrToStringChars(theString);
      m_Impl->MethodB(str);
   }

private:
   UnmanagedClass * m_Impl;
};