C ++ Lambda捕获和引用统计了Windows运行时对象

时间:2016-11-11 06:21:54

标签: javascript c++ c++11 uwp c++-cx

我正在开发一个UWP应用程序,该应用程序使用Javascript作为UI和逻辑代码,在C ++中有一些扩展。 一个扩展是WebP解码器。

目标是将IAsyncOperation中的WebP图像从C ++ / Native代码直接解码为ImageData的数据缓冲区。 我相信我对一个类型为WriteOnlyArray的对象的lambda捕获有一些问题。

C ++部分:

Windows::Foundation::IAsyncOperation<bool>^
WebPDecoder::DecodeRgbaAsyncInto(const Platform::Array<byte>^ input, Platform::WriteOnlyArray<uint8>^ output, int stride) {
    return create_async([input, output, stride]() -> bool {
        auto data = WebPDecodeRGBAInto(input->Data, input->Length, output->Data, output->Length, stride);
        if (data == nullptr) {
            return false;
        }
        return true;
    });
}

Javascript部分:

// _this.decoder = Universal.WebP.WebPDecoder();
//
function decode(data, height, width, canvas) {
    return new Promise(function (resolve, reject) {
        canvas.height = height;
        canvas.width = width;
        var context = canvas.getContext('2d');
        var imageData = context.createImageData(width, height);
        var stride = imageData.data.length / height;
        _this.decoder.decodeRgbaAsyncInto(data, imageData.data, stride).then(function (success) {
            if (success == false) {
                reject(Error("Failed to decode WebP Image"));
                return;
            }
            context.putImageData(imageData, 0, 0);
            context.drawImage(canvas, 0, 0);

            resolve();
        });
    });
}

使用此代码,我在调用lambda函数并被销毁后崩溃。崩溃发生在__abi_winrt_ptr_dtor()中。 我不知道为什么。

如果我改为使用WriteOnlyArray的引用捕获,如下所示,解码在大多数时间都有效,但偶尔会出现崩溃,因为输出似乎变为无效指针。     return create_async([input, &output, stride]() -> bool {

对于这种情况,我怀疑这是因为lambda捕获不会增加WriteOnlArray对象的引用计数,而是在lambda执行之前/期间释放它。

如何在lambda完成之前强制对象可用?

0 个答案:

没有答案