Thể hiện tối thiểu của các vấn đề của tôi mà tôi đã đưa ra như sau:Segmentation lỗi sau khi trở về một cấu trúc liên kết
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;
}
Đoạn kết quả mã trong lỗi segmentation khi chạy nếu biên soạn với clang++
(phiên bản 3.4, mặc định có sẵn trong Ubuntu 14.04). Vấn đề không xảy ra khi tôi biên dịch với g++
(phiên bản 4.8.4). Đây có phải là lỗi trình biên dịch hay có vấn đề với mã của tôi không?
Như một mặt lưu ý: chương trình không sụp đổ nếu bar
được ngăn xếp phân bổ, tức là .:
Bar bar(Foo(0.0f, 0.0f, 0.0f));
bar.bar();
công trình như dự định.
Nó có tạo ra sự khác biệt nào nếu bạn 'xóa thanh 'trước khi thoát? –
@ BarışUşaklı: Không. Vấn đề là chính xác với câu lệnh 'return foo;'. Nếu tôi thay thế nó bằng, ví dụ, 'return Foo (0.0f, 0.0f, 0.0f);' vấn đề đã biến mất. – mrhania
Nâng cao nó như là một lỗi trên trang web lỗi thích hợp? Đây không phải là địa điểm báo cáo lỗi. –