gpt4 book ai didi

c++ - clang vs gcc 运行时差异 : c++ class template built w clang crashes w/o copy constructor, 内置 w gcc 使用复制构造函数崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:10 27 4
gpt4 key购买 nike

除非我为 TableTypeCarrier 模板类包含一个复制构造函数,否则使用 clang(但不是 gcc)构建时,以下代码会在运行时崩溃吗?如果我包含该复制构造函数,为什么我在使用 gcc 构建时会遇到同样的运行时崩溃?

我定义了以下 C++ 类:

class TableTypeCarrierBase {};

template<class T>
class TableTypeCarrier: public TableTypeCarrierBase {
public:
TableTypeCarrier(const T * const p) : m_p(p) {}

#ifdef __clang__
TableTypeCarrier(const TableTypeCarrier<T>& o) : m_p(o.m_p) {}
#endif

const T * Get() const
{
return m_p;
}

private:
const T * const m_p;
};

struct PsiTable {
PsiTable() : m_priv(NULL) { }

template<typename T> void Set(const TableTypeCarrier<T> inT)
{
m_priv = &inT;
}

template<typename T> const T * Get() const
{
return (!m_priv) ? NULL : ((TableTypeCarrier<T>*)m_priv)->Get();
}

private:
const TableTypeCarrierBase *m_priv;
};

您会注意到 TableTypeCarrier 类模板的复制构造函数被条件化为仅由 clang 而不是 gcc 构建。

最初编写此代码时(没有上述条件化复制构造函数),我只是使用 gcc 来构建和测试它。当我尝试测试它用 clang 构建时,构建总是会成功,但是在操作这些类的对象时会出现运行时崩溃。

我花了几个月的时间调试它。我不完全记得导致我尝试向 TableTypeCarrier 模板类添加复制构造函数的路径,但确实解决了我使用 clang 构建的二进制文件的问题。不幸的是,仅声明此复制构造函数似乎会导致与最初描述的问题相同的问题,但仅在使用 gcc 构建时才会出现。

当然,我添加了预编译器指令,以便仅在使用 clang 构建时才对复制构造函数进行条件化。

此修复对我有用,但我想了解原因。

如果您需要上下文来完全理解问题,这里有一个指向标题的链接,该标题在这段确切代码仍然存在的历史时刻在整个项目中定义了这些类:

https://github.com/mkrufky/libdvbtee/blob/v0.4.0/libdvbtee/decode/table/table.h

此后我重构了代码并删除了 TableTypeCarrierBase 类和 TableTypeCarrier 模板类,因为它们是不必要的代理。尽管删除了这段代码,但我仍然想了解为什么当 TableTypeCarrier 具有(或缺少)复制构造函数时,使用 clang 构建的二进制文件与使用 gcc 构建的二进制文件的行为不同。

为什么 clang 构建的二进制文件需要这个复制构造函数?如果包含 gcc 构建的二进制文件,为什么它会崩溃?

最佳答案

我在这里看到一个问题:

template<typename T> void Set(const TableTypeCarrier<T> inT)
{
m_priv = &inT;
}

您正在按值传递参数(并因此制作了它的拷贝),但是您正在获取它的地址并将其分配给成员变量。当函数结束时,您获取地址的对象消失,留下悬空指针。

处于适当高警告级别的编译器应该对此进行标记。

关于c++ - clang vs gcc 运行时差异 : c++ class template built w clang crashes w/o copy constructor, 内置 w gcc 使用复制构造函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846138/

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