Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
托管类中的本机指针 我最近做了一些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 - Fatal编程技术网

托管类中的本机指针 我最近做了一些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语言结合起来。