最近、会社のネイティブ C++ クラスの一部を .NET に統合するために、C++/CLI プログラミングを行っていました。私の質問は些細なことに聞こえるかもしれませんが、これは私が常に確信していないことの 1 つです:
ネイティブ ポインターを持つ ref クラスがある場合、次のように言います。
public ref class ManagedClass {
private:
NativeClass* pObj1;
NativeClass* pObj2;
void DoStuff(NativeClass* obj);
public:
ManagedClass();
bool Activate();
}
そしてコンストラクタのような
ManagedClass::ManagedClass() : pObj1(new NativeClass()), pObj2(new NativeClass()) {;}
そのクラスのインスタンスはマネージド ヒープ上に作成されます。しかし、ネイティブ ヒープ上に作成されたオブジェクトを指していますかpObj1
? pObj2
マネージ クラスのメンバーであっても、これらのポインターを使用するために固定する必要はありませんか? 特に、DoStuff
関数が外部のネイティブ ライブラリ関数を呼び出す場合は、
void ManagedClass::DoStuff(NativeClass* obj) {
int returnCode = External::Function(obj);
if (returnCode == 0) return true;
else return false;
}
などを書く必要はありませんpin_ptr<NativeClass> pinPtr = obj
か?ポインターへの参照が必要な場合は状況が異なると思います。ただし、ここでは、ポインター自体の場所はメモリの再割り当てによって異なる場合があることを理解していますが、その内容、つまりネイティブ ヒープ上のメモリ アドレスは、ガベージ コレクターがそのメモリにアクセスしないため、有効なままです。これは正しく、上記のようなコードは安全に使用できますか? ご協力いただきありがとうございます!
マシュー