【发布时间】:2015-12-22 17:14:44
【问题描述】:
我提出的问题的最小实例如下:
struct __attribute__((aligned(16))) Foo {
float x, y, z;
Foo(float x, float y, float z) : x(x), y(y), z(z) {}
};
class Bar {
public:
Foo foo;
Bar(const Foo &foo) : foo(foo) {}
Foo bar() { return foo; }
};
int main()
{
Bar *bar = new Bar(Foo(0.0f, 0.0f, 0.0f));
bar->bar();
return 0;
}
如果使用clang++(版本 3.4,Ubuntu 14.04 中的默认版本)编译,这段代码在运行时会导致分段错误。当我使用g++(4.8.4 版)编译它时,不会出现问题。这是编译器错误还是我的代码有问题?
附带说明:如果bar 是堆栈分配的,则程序不会崩溃,即:
Bar bar(Foo(0.0f, 0.0f, 0.0f));
bar.bar();
按预期工作。
【问题讨论】:
-
退出前
delete bar;有什么不同吗? -
@BarışUşaklı:不。问题恰恰出在
return foo;语句上。例如,如果我将其替换为return Foo(0.0f, 0.0f, 0.0f);,问题就消失了。 -
在适当的错误网站上将其作为错误提出?这不是错误报告场所。
-
用 std::alignas 试过了吗?
-
查看生成的 asm 代码可能会提供一些见解。据我了解,它看起来像一个编译器错误。但我不是语言律师,所以我不能确定这是一个编译器错误。如果我们忽略了一些语言模糊,生成的代码可能会提供提示以查看我们忽略的内容。
标签: c++ segmentation-fault g++ clang