微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么抽象类和 std::function 用法的这种奇怪组合仅在 droidx64 船舶构建上崩溃?

如何解决为什么抽象类和 std::function 用法的这种奇怪组合仅在 droidx64 船舶构建上崩溃?

虽然崩溃重现在使用 droidx64 飞船的一个构建设置中始终如一,但在另一艘 droidx64 飞船中却没有,因此您可能无法重现崩溃。试图看看有什么不同。

崩溃的使用ndk-21.0.17 强制 -O0 优化可以防止崩溃,-O1 之后会导致崩溃。 它不会在任何其他平台上崩溃。

我正在尝试找出构建系统中的差异。

这是可以重现崩溃的最小代码片段,因为防止崩溃的因素包括

  • 从 ITest1 或 ITest2 中删除继承,为什么?
  • 删除 m_callback 或使其成为 shared_ptr,为什么?
#include <functional>
#include <memory>

struct ITest1
{
   virtual ~ITest1() = default;
   virtual void TestMethod1() noexcept = 0;
};

struct ITest2
{
   virtual ~ITest2() = default;
   virtual void TestMethod2() noexcept = 0;
};

using TestCallback = std::function<void()>;


class TestClass final : public ITest1,public ITest2
{
public:

   void TestMethod1() noexcept override
   {

   }

   void TestMethod2() noexcept override
   {

   }

private:
   TestCallback m_callback;
};

int main()
{
    std::make_shared<TestClass>(); // Crashes here

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。