Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Uwp 在循环中OpenReadAsync之后,StorageFile的IVectorView变为null(可能是winrt错误)_Uwp_C++ Winrt - Fatal编程技术网

Uwp 在循环中OpenReadAsync之后,StorageFile的IVectorView变为null(可能是winrt错误)

Uwp 在循环中OpenReadAsync之后,StorageFile的IVectorView变为null(可能是winrt错误),uwp,c++-winrt,Uwp,C++ Winrt,我正在BlankApp项目模板内创建一个运行时类,该类打开一个IVectorView,它通过引用将其作为参数接收。然后它在向量上循环以读取文件。然而,当我试图在调用read之后使用向量时,它抛出了一个read访问冲突 我之所以认为这是一个bug,是因为它只在我使用BlankApp项目的x64配置编译时发生。在x86中,不会引发异常 这是很容易复制的,所以如果有人能确认这是否发生在他们身上,那就太好了 //test_class.idl [可装订] [默认_接口] 运行时类测试 { 考级; Itas

我正在BlankApp项目模板内创建一个运行时类,该类打开一个IVectorView,它通过引用将其作为参数接收。然后它在向量上循环以读取文件。然而,当我试图在调用read之后使用向量时,它抛出了一个read访问冲突

我之所以认为这是一个bug,是因为它只在我使用BlankApp项目的x64配置编译时发生。在x86中,不会引发异常

这是很容易复制的,所以如果有人能确认这是否发生在他们身上,那就太好了

//test_class.idl [可装订] [默认_接口] 运行时类测试 { 考级; ItasycActudieRead文件FieldWOS.Fastual.CopysS.IcEvTrVIEW文件; } //test_class.cpp Windows::Foundation::IAsyncation测试\类::读取\文件Windows::Foundation::集合::IVectorView常量和文件 { 用于自动文件:文件(&F) { 自动恢复=文件; auto stream=co_wait file.OpenReadAsync; auto res2=files;//读取访问冲突。此->**m\u ptr**为0xFFFFFFFFFFFF。 } co_返回; } //MainPage.cpp Windows::Foundation::iSyncAction主页::onclick_按钮Windows::Foundation::IInspectable const&sender,Windows::UI::Xaml::RoutedEventArgs const&args { BlankApp1::test\u class m\u test\u class=winrt::make; Windows::Storage::picker::FileOpenPicker-picker; picker.FileTypeFilter.AppendL.bmp; Windows::Foundation::Collections::IVectorView files=co_wait picker.pickMultipleFileAsync; co_wait m_test_class.read_文件文件; }
发生这种情况是因为您通过引用将参数传递给异步方法。在co_wait期间,调用函数onclick_按钮可能已经清除了引用所引用的对象,基本上导致了一个悬空引用。为了避免这种情况,您的协同程序应该通过值而不是引用来接受参数

有关更多详细信息,请参阅以下部分:

发生这种情况是因为您通过引用异步方法传递参数。在co_wait期间,调用函数onclick_按钮可能已经清除了引用所引用的对象,基本上导致了一个悬空引用。为了避免这种情况,您的协同程序应该通过值而不是引用来接受参数

有关更多详细信息,请参阅以下部分:

如果我理解正确,投影类型在道德上等同于std::shared\u ptr。在这种情况下,有两个直接后果,文档中没有明确指出:1通过值传递是相当便宜的指针副本,加上簿记。2逻辑上按值传递等于按引用传递;没有创建新的实现实例,并且投影的类型副本仍然引用原始实现。我是对的,还是我的思维模式被打破了?这基本上是正确的。按值传递不涉及堆分配之类的疯狂操作。但簿记仍然带来了明显的非微不足道的性能成本。addref和release都涉及虚拟函数调用,引用计数通常是互锁的。因此,尽可能地传递const ref,但在需要传递值时也不要失去太多睡眠。如果我理解正确,投影类型在道德上等同于std::shared_ptr。在这种情况下,有两个直接后果,文档中没有明确指出:1通过值传递是相当便宜的指针副本,加上簿记。2逻辑上按值传递等于按引用传递;没有创建新的实现实例,并且投影的类型副本仍然引用原始实现。我是对的,还是我的思维模式被打破了?这基本上是正确的。按值传递不涉及堆分配之类的疯狂操作。但簿记仍然带来了明显的非微不足道的性能成本。addref和release都涉及虚拟函数调用,引用计数通常是互锁的。所以,尽可能地传递const ref,但在需要传递值时也不要失去太多睡眠。