C++/CX是否检测并解决了对象的循环?

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的水平,这是在接口方面定义IWeakReferenceIWeakReferenceSource,你可以在看为"%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将会犹豫不决,用粗线等强调它.尽管如此,编译器可以很好地处理它们.