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;
};
我正在构建要从 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;
};