2015-12-22 14 views
5

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.

+0

Nó có tạo ra sự khác biệt nào nếu bạn 'xóa thanh 'trước khi thoát? –

+0

@ 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

+0

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. –

Trả lời

0

Tôi đoán rằng phiên bản dựa trên ngăn xếp được căn chỉnh ok bởi may mắn. Thêm U8 trước khi lệnh có thể làm cho ngăn xếp khác nhau để bạn có thể kiểm tra nó. Khi bạn đặt nó trên heap nó được ngẫu nhiên :-) Có một cơ hội bạn gặp phải lỗi khi tạo mã vì có lẽ giá trị 32 bit của bạn đã được căn chỉnh trên ranh giới 16 bit và mã đã được tạo cho truy cập chưa được ký. X86 sẽ âm thầm xử lý ngoại lệ này nhưng không xử lý nổi. Điều đó cũng đáng để thử-đổi thành ints.

Các vấn đề liên quan