小编Pab*_*o H的帖子

将 unique_ptr 传递给虚函数时的 C++/CLI 编译器错误?

下面包含的代码在编译为 C++ 时工作正常,但在编译为 C++/CLI ( /clr)时会导致(例如)访问冲突 (System.AccessViolationException )。在这两种情况下,代码编译和链接都没有错误或警告 ( /W4)。

c->g(std::move(p)); (摘抄)

问题似乎是调用函数之前创建的临时 unique_ptr 参数被销毁。这在调用虚函数 ( C::gand C::k) 时发生,但在调用非虚函数 ( C::hand ::g)时不会发生。无论调用代码是非托管类 ( struct) 还是托管类 ( ) 的一部分,都会发生这种情况ref struct。它不是,如果我换用类发生#pragma unmanaged。(当然,示例代码仅在不使用 C++/CLI-only 功能时才编译为非托管 C++。)

有点相关:在 C++/CLI 中使用 unique_ptr 时出现链接器错误,但我的代码链接正常。

问题:这是编译器中的错误吗?如果是这样,这是一个已知的错误吗?如果不是,它是否是 C++/CLI 的已知限制?或者,代码中的错误?如果是编译器错误或限制,是否有(最好是简单的)解决方法而不更改函数签名(如本答案中所建议)?

(生成的代码:虽然我熟悉汇编,但我不明白,在调试器显示的C++/CLI编译过程的反汇编中,对虚函数的调用在哪里。调试时我最终只步入所有unique_ptr 的东西,但不是函数调用......)

(一些背景:调用代码、托管类旨在作为 C# 代码和非托管 C++ 库之间的桥梁。)

使用:
Microsoft Visual Studio Professional 2015 Version 14.0.25425.01 Update 3;
Visual …

virtual-functions c++-cli unique-ptr visual-studio-2015

5
推荐指数
0
解决办法
537
查看次数