gpt4 book ai didi

c++ - 对 clang 中析构函数的 undefined reference

转载 作者:行者123 更新时间:2023-12-02 04:13:44 28 4
gpt4 key购买 nike

编译以下代码会给出“对`A::~A()的 undefined reference ”:

#include <cstdlib>
#include <memory>

template <typename T>
struct A {
A() {}
~A() {}
};

struct Aggregate {
using key_vector = A<char>;
using value_vector = A<int>;

value_vector vals;
key_vector keys;
};

int
main()
{
auto x = malloc(sizeof(Aggregate));
new (x) Aggregate{};

return 0;
}

该问题存在于 clang 7.0 和 6.0 上(可能还有一些较旧的版本)。请参阅:https://godbolt.org/z/GNPk3V

在较新的 clang 版本和 gcc 上它工作正常。

这是预期的还是 clang 中的某种错误?

最佳答案

这似乎是Bug 28280 ,由 https://reviews.llvm.org/D45898 修复:

If an initializer in a braced-init-list is a C++ class that has a non-trivial destructor, mark the destructor as referenced. This fixes a crash in CodeGenFunction::destroyCXXObject that occurs when it tries to emit a call to the destructor on the stack unwinding path but the CXXRecordDecl of the class doesn't have a CXXDestructorDecl for the destructor.

此示例确实使用了花括号初始化列表,并在调用_Unwind_Resume之前发出析构函数调用。析构函数并不简单。将初始化更改为使用 () 而不是 {} 会使错误消失,因为它不再使用花括号初始化列表进行初始化。我的评论中的析构函数调用可能会导致析构函数被标记为引用。也许启用优化会产生相同的效果,使其仅出现在重要的析构函数中。

关于c++ - 对 clang 中析构函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58339496/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com