C++/CLI:返回对 C#.NET 应用中非托管对象的引用
C++/CLI: return a reference to unmanaged object in a C#.NET app
我正在使用C++/CLI将一些功能从本机C++dll包装到.NET。我的一个本机类(类 UA)有一个返回对另一个本机类/对象(类 UB)的引用的方法。我已经将这两个类包装在我的 C++/CLI 项目中,如下所示:
//Unmanaged classes
class UA
{
public:
A(int x) : m_x(x) {}
int m_x;
};
class UB
{
public:
UB() : a(1) {}
UA& get_A(){return a;}
protected:
UA a;
};
// managed classes /CLI
public ref class A
{
internal:
A(UA* a) : m_ptr(a) {}
public:
A() : m_ptr(new UA(1)) {}
~A()
{
this->!A();
}
!A()
{
if (m_ptr != nullptr)
{
delete m_ptr;
}
}
private:
UA* m_ptr;
};
public ref class B
{
public:
B() : m_ptr(new UB()) {}
A^ get_A(){return gcnew A(&m_ptr->get_A())}
~B()
{
this->!B();
}
!B()
{
if (m_ptr != nullptr)
{
delete m_ptr;
}
}
private:
UB* m_ptr;
};
上面的编译是用/clr
;但是,在C#.NET应用程序中进行测试时,我得到一个调试断言错误。
// C#.NET app
B b = new B();
A = b.get_A();
此错误发生在托管包装class A
的终结器(!A())
中。特别是,当 GC 尝试删除本机指针时会引发此问题。我想这只是为什么我没有使用 new 关键字创建此实例的原因。您是否认为在本机C++中使用复制构造函数,然后使用 new 关键字创建托管包装类会更好?
例如:
//Unmanaged classes
class UA
{
public:
A(int x) : m_x(x) {}
A(const A& a)
{
m_x = a.m_x;
}
int m_x;
};
然后托管 A 和 B 包装器将是:
// managed classes /CLI
public ref class A
{
internal:
A(UA* a) : m_ptr(a) {}
public:
A() : m_ptr(new UA(1)) {}
~A()
{
this->!A();
}
!A()
{
if (m_ptr != nullptr)
{
delete m_ptr;
}
}
private:
UA* m_ptr;
};
public ref class B
{
public:
B() : m_ptr(new B()) {}
A^ get_A(){return gcnew A(new UA(&m_ptr->get_A()))}
~B()
{
this->!B();
}
!B()
{
if (m_ptr != nullptr)
{
delete m_ptr;
}
}
private:
UB* m_ptr;
};
在 C# 中,是否有任何不同的方法返回对非托管对象的引用?抱歉,如果我做错了什么,我在 C++/CLI 方面的经验很少。我也看过这篇文章;但是,似乎接受的答案提出了我首先实施的解决方案。 我感谢任何帮助/建议。
这只是因为当你调用b.get_A()
时,这会调用你的内部构造函数A(UA* a) : m_ptr(a) {}
它只存储指向UB
型对象的字段a
的指针。然后,析构函数将尝试删除此无法工作的指针。
这与 C++/CLI 无关,只是与分配和删除对称。在这种情况下,只需删除执行分配的公共构造函数A()
以及这些析构函数,它就会起作用。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则