托管类中的本机指针 我最近做了一些C++/CLI编程,以便把我们公司的一些C++类集成到.NET中。我的问题可能听起来很琐碎,但有一件事我总是不确定: 如果有一个带有本机指针的ref类,比如 public ref class ManagedClass { private: NativeClass* pObj1; NativeClass* pObj2; void DoStuff(NativeClass* obj); public: ManagedClass(); bool Activate(); }
还有一个像托管类中的本机指针 我最近做了一些C++/CLI编程,以便把我们公司的一些C++类集成到.NET中。我的问题可能听起来很琐碎,但有一件事我总是不确定: 如果有一个带有本机指针的ref类,比如 public ref class ManagedClass { private: NativeClass* pObj1; NativeClass* pObj2; void DoStuff(NativeClass* obj); public: ManagedClass(); bool Activate(); },c++,.net,memory-management,c++-cli,C++,.net,Memory Management,C++ Cli,还有一个像 ManagedClass::ManagedClass() : pObj1(new NativeClass()), pObj2(new NativeClass()) {;} 该类的实例将在托管堆上创建。但是,pObj1和pObj2是否指向在本机堆上创建的对象?因此,即使这些指针是托管类的成员,使用它们也不需要固定?特别是,如果DoStuff函数调用外部本机库函数,例如 void ManagedClass::DoStuff(NativeClass* obj) { int r
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 pinPtr=obj
等的内容。?我想如果需要引用指针,情况就不同了;然而,在这里,我理解指针本身的位置可能会因内存重新分配而变化,但其内容(即本机堆上的内存地址)仍然有效,因为垃圾收集器不会触及该内存。这是正确的,并且像上面的代码一样可以安全使用吗?
谢谢你的帮助
Matthew对于您的问题,您发布的代码是正确的,可以正常工作
我认为最好使用C++ +CLI作为C++原生类的包装器,所以所有的公共方法都应该只接收托管对象作为参数,否则只使用<代码> COM< /COD> < /P>是的,这是正确的,问题中显示的代码是可以的。不要忘记通过正确地实现
Dispose
模式来释放这些指针。老实说,除非我真的必须,否则我不会碰COM
。我认为C++/CLI非常强大,为什么只将其用于包装?但是,我同意公共函数应该只接受托管对象,以便类可以灵活地集成到例如C#GUI中。上面的DoStuff
函数是私有的,但是,我并不意味着C++ +CLI应该只是一个包装器,我想说的是C++的所有优点都失去了。第二,你的公共方法开始接收本地的点,只要你避免它,所有的都应该是很棒的,你可以将C++和C语言结合起来。