为什么这会引发“读取访问冲突”?

时间:2019-08-19 11:23:52

标签: windows win-universal-app c++-cx

现在,我试图在读取和处理文件时显示进度条对话框,但是我的代码在关闭对话框时抛出“读取访问冲突”。

确切的错误消息是

**__pUnknown** was 0xFFFFFFFFFFFFFFFF.

下面是我的代码。

void LoadFile(StorageFile^ file) {
    ContentDialog^ loaderDialog = ref new ContentDialog();
    loaderDialog->Title = L"Loading...";
    loaderDialog->Content = ref new ProgressBar();
    loaderDialog->ShowAsync();

    Concurrency::create_task(FileIO::ReadTextAsync(file))
        .then([&](Platform::String^ fileText) {

            // File processing parts are omitted.
            // ...

            loaderDialog->Hide(); // Read access violation!
        }
    );
}

为什么这会成为错误?

1 个答案:

答案 0 :(得分:2)

发件人:https://devblogs.microsoft.com/cppblog/ccx-part-2-of-n-types-that-wear-hats/

  

那么,^类型到底是什么?帽子类型是一种智能指针类型,   (1)自动管理Windows Runtime对象的生存期,并   (2)提供自动类型转换功能以简化使用   Windows运行时对象。

您正在引用智能指针,因此您没有增加其引用计数,请参见https://docs.microsoft.com/en-us/windows/win32/com/rules-for-managing-reference-counts。 这意味着当执行延续时,引用将悬空。

您可以尝试按值[=]而不是引用[&]进行捕获。 请注意,您应该在捕获中考虑捕获每个变量,而不要使用[=][&]