cuốn sách gpt4 ai đã làm

tăng cường hàm hủy biến thể gây ra lỗi segfault

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 07:34:01 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi gặp sự cố khi sử dụng biến thể Boost. Tôi gặp lỗi phân đoạn khi biến thể bị hỏng.

Điều kỳ lạ là lỗi phân tách này chỉ xảy ra khi tôi không kích hoạt tối ưu hóa trình biên dịch (trong trường hợp của tôi là GCC). Ví dụ: ở chế độ O1, O2, O3, tôi chạy mã của mình mà không gặp vấn đề gì.

Biến thể của tôi được định nghĩa như thế này:

tăng cường typedef::biến thể<
ASTFunctionCall,
ASTSwap,
Tuyên bố AST,
Nhiệm vụ ASTA,
ASTNếu,
ASTTrong khi đó,
ASTForeach,
ASTFor>
ASTHướng dẫn;

Tất cả các phần tử của biến thể đều được Trì hoãn. Việc xây dựng trì hoãn cho phép xây dựng các đối tượng một cách lười biếng. Có vẻ như đối tượng không được xây dựng trước khi truy cập vào một trong các trường của nó. Đối tượng thực được hỗ trợ bởi Shared_ptr.

Và lỗi xảy ra khi phá hủy cha mẹ:

Khai báo hàm struct { 
bối cảnh std::shared_ptr;
std::string returnType;
std::string functionName;
std::string mangledName;
tham số std::vector;
hướng dẫn std::vector;
};

Khi vectơ lệnh bị xóa, lỗi segfault xảy ra khi việc xóa biến xảy ra trong hàm cụ thể này:

0x0000000000d71972 trong boost::variant < eddic::Deferred < eddic::FunctionCall, std::shared_ptr < eddic::FunctionCall > >, eddic::Deferred >, eddic::Deferred < eddic::Declaration, std::shared_ptr < eddic::Tuyên bố>>, eddic::Deferred < eddic::Assignment, std::shared_ptr < eddic::Assignment > >, eddic::Deferred < eddic::If, std::shared_ptr < eddic::If > >, eddic::Deferred < eddic ::while, std::shared_ptr < eddic::while> >, eddic::Deferred < eddic::Foreach, std::shared_ptr < eddic::Foreach> >, eddic::Deferred < eddic::For, std::shared_ptr < eddic::For> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail:: biến thể::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::using_backup() const ()

EDIT 2: Sau khi xóa recursive_wrapper và intrusive_ptr để kiểm tra, lỗi hiện là xác nhận tăng cường: Lỗi nội bộ Boost.Variant: Out of range.

Có một số hạn chế trong việc tiêu diệt các biến thể? Giống như một loại lớp học nào đó mà chúng ta không thể đưa một biến thể vào?

Cảm ơn trước vì bất kỳ suy nghĩ nào về vấn đề này

EDIT: Có phải nó xuất phát từ thực tế là biến thể chứa Trì hoãn, Trì hoãn, ... nhiều lần không?

câu trả lời hay nhất

Tôi không biết chính xác bạn cần ngữ nghĩa gì, nhưng bạn có thể đơn giản hóa cây cấu trúc biến thể như thế này không:

tăng cường typedef::biến thể<
ASTFunctionCall,
ASTSwap,
Tuyên bố AST,
Nhiệm vụ ASTA,
boost::recursive_wrapper<
boost::variant >
ASTHướng dẫn;

?

Về c++ - hàm hủy biến thể tăng cường gây ra lỗi phân đoạn, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/8079017/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress