我正在BlankApp项目模板中创建一个运行时类,该类将打开一个IVectorView<StorageFile>
,它通过引用作为参数接收。然后,它遍历向量以便从文件中读取。但是,当我尝试在调用read之后使用vector时,它将引发读取访问冲突。
之所以认为这是一个错误,是因为它仅在我使用BlankApp项目的x64配置进行编译时发生。在x86中,不会引发异常。
这很容易复制,因此如果其他人可以确认是否发生在他们身上会很好。
//test_class.idl
[bindable]
[default_interface]
runtimeclass test_class
{
test_class();
Windows.Foundation.IAsyncAction read_files(Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFile> files);
}
//test_class.cpp
Windows::Foundation::IAsyncAction test_class::read_files(Windows::Foundation::Collections::IVectorView<Windows::Storage::StorageFile> const& files)
{
for (auto& file : files)
{
auto res = files;
auto stream = co_await file.OpenReadAsync();
auto res2 = files; // read access violation. this->**m_ptr** was 0xFFFFFFFFFFFFFFFF.
}
co_return;
}
//MainPage.cpp
Windows::Foundation::IAsyncAction MainPage::onclick_button(Windows::Foundation::IInspectable const & sender, Windows::UI::Xaml::RoutedEventArgs const & args)
{
BlankApp1::test_class m_test_class = winrt::make<BlankApp1::implementation::test_class>();
Windows::Storage::Pickers::FileOpenPicker picker;
picker.FileTypeFilter().Append(L".bmp");
Windows::Foundation::Collections::IVectorView<Windows::Storage::StorageFile> files = co_await picker.PickMultipleFilesAsync();
co_await m_test_class.read_files(files);
}
答案 0 :(得分:4)
之所以发生这种情况,是因为您要通过引用异步方法来传递arg。在co_await
期间,调用函数(onclick_button
)可能已经清理了引用所引用的对象,基本上导致了悬挂的引用。为避免这种情况,协程应按值而不是按引用接受参数。
有关更多详细信息,请参见以下部分: https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/concurrency#parameter-passing