dal*_*lle 11 c++ reference-counting windows-runtime c++-cx
根据我的理解, C++/CX不使用垃圾收集,而是使用引用计数方法.
引用计数的问题在于它不能处理循环.循环通常使用弱引用来解决,例如标准C++中的weak_ptr.
但我无法在C++/CX中找到明确指定弱引用的方法.从那以后我会假设这是由C++/CX本身处理的.我想知道C++/CX将如何解决这个问题.
例如,查看以下代码:
ref class Foo
{
public:
Bar^ bar;
};
ref class Bar
{
public:
Foo^ foo;
};
ref class App
{
public:
virtual void OnLaunched(LaunchActivatedEventArgs^ args)
{
Foo^ foo = ref new Foo();
Bar^ bar = ref new Bar();
foo.bar = bar;
bar.foo = foo;
}
};
Run Code Online (Sandbox Code Playgroud)
C++/CX如何检测此循环?
C++/CX如何解决这个循环?
C++/CX如何决定这些对象中的哪一个应该是"根对象",哪一个应该是"弱引用"?
Pav*_*aev 12
简短回答:不,C++/CX不会检测和解决对象循环.
答案很长:WinRT本身有一个弱引用的标准机制.在ABI的水平,这是在接口方面定义IWeakReference和IWeakReferenceSource,你可以在看为"%ProgramFiles%\的Windows套件\ 8.0 \包含\的WinRT\WeakReference.idl".
在C++/CX中,所有类都将自动实现IWeakReferenceSource,因此所有实例都可以被弱引用.要获取并存储对象的弱引用,您应该使用辅助类Platform::WeakReference(在vccorlib.h中定义):
Foo^ foo = ref new Foo;
Platform::WeakReference weakRef(foo);
Run Code Online (Sandbox Code Playgroud)
要检索回来的对象,请使用Resolve<T>:
foo = weakRef.Resolve<Foo>();
Run Code Online (Sandbox Code Playgroud)
像往常一样,你会得到nullptr的对象已被破坏.
除此之外,一个WeakReference行为的实例或多或少像一个智能指针 - 它是可复制的,可移动的,可比较的,可分配的nullptr,具有隐式转换为未指定的bool类型等.
请注意,从VS11 Beta开始,WeakReference如果您尝试使用它,IDE Intellisense将会犹豫不决,用粗线等强调它.尽管如此,编译器可以很好地处理它们.