2013-08-02 25 views
5

Tôi đã tự hỏi nếu ai đó có thể làm sáng tỏ một số quy trình xử lý bộ nhớ trong C++.Khi nào bộ nhớ được giải quyết liên quan đến các biến tĩnh?

Nếu tôi có một cấu trúc mà tôi tuyên bố tĩnh, như vậy mà constructor của nó là điều đầu tiên để thực hiện và destructor của nó là điều cuối cùng để thực hiện:

struct initializer execute_before_and_after_main { 
    initializer() { init(); } 
    ~initializer() { cleanup(); } 
} 
static initializer execute_around_main; 

Và sau đó tôi có một cái gì đó như:

class my_class { 
    my_object objects[100]; 
} 
extern my_class gobal_my_class; 
my_class global_my_class; 

và chính là không quan trọng ở đây:

int main (int argc, char* argv[]) { 
    .... 
} 

Khi cleanup() được gọi, là mảng objects hiện có chứa bộ nhớ deallocated/không hợp lệ? Có một chuỗi tiêu chuẩn khởi tạo/hủy diệt mà C++ thực hiện ở đây mà ai đó có lẽ có thể chỉ cho tôi?

Cảm ơn

EDIT: Tôi hiểu loại mã là có thể không phải là thực hành tốt nhất, nhưng tôi vẫn tự hỏi nếu hành vi được xác định.

+5

Thời gian để làm quen với cuối [thời gian lưu trữ] (http://en.cppreference.com/w/cpp/language/storage_duration) –

+0

@CaptainObvlious lol Tôi sắp đặt liên kết tương tự đó vào câu trả lời của tôi – aaronman

+1

Không có chuỗi được xác định chuẩn để khởi tạo và hủy các đối tượng có thời gian lưu trữ tĩnh; điều này được gọi là [fiasco thứ tự khởi tạo tĩnh] (http://www.parashift.com/c++-faq/static-init-order.html) – Praetorian

Trả lời

3

Biến tĩnh và toàn cục đều có static storage duration có nghĩa là chúng được giải phóng khi chương trình kết thúc. Từ đọc một trong các bản sao tôi thấy rằng nếu mã là tất cả trong cùng một đơn vị dịch (mà bạn là) thì các đối tượng với lưu trữ tĩnh bị hủy theo thứ tự ngược lại của xây dựng. Nếu các đối tượng ở các đơn vị dịch khác nhau, bạn không thể đảm bảo bất cứ điều gì.

Khi cleanup() được gọi, là mảng đối tượng hiện có chứa bộ nhớ deallocated/không hợp lệ?

Có, nhưng nó không thực sự quan trọng vì nó chỉ được gọi khi đối tượng nằm ngoài phạm vi

là global_my_class destructed trước execute_around_main?

có, toàn cầu lớp học của tôi được destructed đầu tiên bởi vì nó được khởi tạo

+0

"Có chuỗi tiêu chuẩn khởi tạo/hủy diệt C++ thực hiện ở đây" Thực tế là chúng được giải phóng khi chương trình kết thúc KHÔNG giải quyết câu hỏi nếu bộ nhớ 'global_my_class' hợp lệ trong quá trình hủy' execute_around_main' . –

+0

@MooingDuck vì vậy nếu tôi chỉ trả lời một nửa câu hỏi bạn cảm thấy cần phải downvote, tôi sẽ cố gắng giải quyết câu trả lời nhưng tôi không rõ 100% về những gì anh ấy đang cố hỏi – aaronman

+0

"Khi cleanup() được gọi, là mảng đối tượng hiện chứa bộ nhớ deallocated/không hợp lệ? " -> "' Global_my_class' bị hủy trước 'execute_around_main'?" –

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