met*_*tal 7 c++-cli smart-pointers
我已经习惯了C++ RAII工具,我想以正确的方式使用RAII和C++/CLI中的托管代码.Herb Sutter和微软都告诉我这是最好的做法.
我有这样的事情:
ref struct Managed
{
// No default constructor
Managed( /*...*/ ) { /*...*/ }
~Managed() { /* Important non-managed resource release here */ }
// ...
};
ref struct UsesManaged
{
Managed^ m_;
array<Managed^>^ a_;
UsesManaged( Managed^ m, array<Managed^>^ a ) : m_(m), a_(a) {}
// ...
};
ref struct Creator
{
Managed^ m_;
array<Managed^>^ a_;
UsesManaged^ u_;
Creator()
{
// Must allocate dynamically here, not in initializer list
// because in my real code, I use "this" here for a callback.
m_ = gcnew Managed( /*...*/ );
a_ = gcnew array<Managed^>( 2 );
a_[ 0 ] = gcnew Managed( /*...*/ );
a_[ 1 ] = gcnew Managed( /*...*/ );
u_ = gcnew UsesManaged( m_, a_ );
}
};
Run Code Online (Sandbox Code Playgroud)
我希望(1)自动资源销毁,所以我不必手动删除每个gcnew'ed对象,特别是在异常情况下; (2)安全清晰地共享对象的能力(绕过std :: auto_ptr等不符合条件); (3)能够让我的类被VB或C#消耗,并在对象超出范围时自动运行清理(例如,由于异常).
在标准C++中,我使用std :: shared_ptr和std :: vector或类似的工具来自动化RAII.在这里,我可以使用STL/CLI的向量,但是没有shared_ptr等价物.我看到的唯一相关的C++/CLI智能指针是稀疏记录的msclr :: auto_handle,它类似于std :: auto_ptr,包括所有权转移语义,它与向量不兼容,尽管它们可以正常工作数组.
什么是实现我的三个目标的正确的C++/CLI方式?(另请注意,我的主要C++/CLI类,上面的Creator,将由VB/C#使用.)
[更新:在顶部添加了Herb Sutter和MS的链接,并添加了目标3(通过VB/C#消费).
我认为我的问题的正确答案是比利·奥尼尔对其他人答案的评论:
\n\n\n\n\n\n啊——你不能那样做。没有办法强制垃圾收集器销毁对象。请参阅\n blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx \n 正确的方法是要求\n 显式关闭调用,并调用\n在终结器中。如果出于某种原因客户端代码没有清理,GC 将(最终)为您清理它(如果没有其他原因,则在程序终止时),但您不能编写这样的代码取决于\n。\xe2\x80\x93 比利·奥尼尔 9 月 10 日 \'10 at\n 16:02
\n