2013-01-15 25 views
22

Trong mã C++ 11 của tôi, tôi có được kêu vang cảnh báo "Tuyên bố yêu cầu một destructor thoát thời gian" trong trường hợp sau đây:Làm thế nào để đối phó với cảnh báo "phá hủy thời gian thoát" trong tiếng kêu?

static const std::map<int, const someStruct> mymap = { 
    {1, { 
     "A", 
     "B", 
     "C" 
    }}, 
    {2, { 
     "D", 
     "E", 
     "F" 
    }} 
}; 

Theo như tôi hiểu Google một "lối ra thời gian destructor" là bắt buộc để tiêu diệt main() và statics theo cách xác định để ngăn chặn sự cố khi thoát do "biến đã được phát hành". Có đúng không? Ai đó có thể giải thích nó tốt hơn?

Plus: Tôi có thể làm gì với nó (Tôi không muốn tắt cảnh báo)? Mã ở trên chỉ được sử dụng trong ngữ cảnh của một chuỗi.

Có vẻ như đây là cách Chromium xử lý những trường hợp này; đó có phải là cách đúng đắn cho trường hợp của tôi không?

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \ 
    static type& name = *new type arguments 

(Nguồn: https://chromium.googlesource.com/chromium/src/+/32352ad08ee673a4d43e8593ce988b224f6482d3/base/basictypes.h)

Trả lời

14

đối tượng tĩnh toàn cầu và chức năng sẽ nhận được destructors họ gọi khi ứng dụng của bạn được thoát. những destructors này là "destructors time exit". và được gọi theo thứ tự ngược lại mà chúng được xây dựng.

Như bạn đã nói, nếu một số trong số các trình phá hủy này chạm vào các đối tượng đã bị phá hủy, chương trình của bạn có thể bị lỗi. Ngoài ra, các destructors chạy ở thời gian thoát sẽ làm cho chương trình thoát chậm hơn, và phần lớn thời gian chúng không cần thiết cho tính chính xác của chương trình (vì khi chương trình thoát, nó sẽ giải phóng tất cả bộ nhớ của nó).

Cảnh báo chỉ đơn giản là chỉ ra rằng bạn có các trình phá hủy sẽ chạy vào thời gian thoát.

Khắc phục bạn đề xuất sẽ phân bổ đối tượng, điều này sẽ không làm cho nó bị tự động hủy khi thoát chương trình. Đối với trường hợp của bạn, điều này có lẽ là đủ tốt.

+0

Tùy thuộc vào những gì destructor 'someStruct' làm. Tôi thường cảnh giác với việc ngăn chặn việc phá hủy các hoạt động phá hoại. Việc quản lý bộ nhớ có thể không còn là vấn đề nữa khi thoát chương trình, nhưng các hoạt động không tầm thường khác có thể phải chạy. Trong một kịch bản phức tạp hơn, nó nhanh chóng trở nên khó để chứng minh rằng không chạy destructors không có tác dụng ngược. Hơn nữa, sự chậm lại ở lối ra chương trình là đáng chú ý chỉ khi phần lớn bộ nhớ được phát hành. –

+0

Vâng, đó là lý do tại sao tôi nói "có thể" và "hầu hết thời gian". Nếu destructors của bạn tương tác với phần còn lại của hệ thống thông qua một số loại IO, sau đó bạn muốn những destructors để chạy. Một ví dụ đơn giản sẽ là một đối tượng cấu hình toàn cầu lưu các thiết lập vào đĩa khi chương trình đang thoát, và bạn dựa vào destructor để biết khi nào điều đó xảy ra (không phải tôi ủng hộ mã thực hiện điều này). – yiding

+1

@KonradRudolph Cấu trúc là ba "const char *". Vì vậy, đồng nghiệp của tôi đúng đối tượng mà phân bổ đống là quá mức cần thiết. Có cách nào để làm cho cảnh báo này miễn phí mà không cần phân bổ đống không? –

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