【问题标题】:Why is this throwing "read access violation"?为什么这会引发“读取访问冲突”?
【发布时间】:2019-12-24 14:47:00
【问题描述】:

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

确切的错误信息是,

**__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!
        }
    );
}

为什么这会变成错误?

【问题讨论】:

  • 不是 C++/CX 方面的专家,但我会尝试通过值 [=] 而不是通过引用 [&] 来捕获。
  • @CuriouslyRecurringThoughts 我认为你是专家!谢谢,问题解决了!

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


【解决方案1】:

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

那么,^ 类型到底是什么? hat 类型是 智能指针 类型 (1) 自动管理 Windows 运行时对象的生命周期,并且 (2) 提供自动类型转换功能,简化使用 Windows 运行时对象。

您正在对智能指针进行引用,因此您不会增加其引用计数,请参阅https://docs.microsoft.com/en-us/windows/win32/com/rules-for-managing-reference-counts。 这意味着当继续执行时,引用是悬空的。

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

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多