2009-08-07 19 views

Trả lời

36

Vâng, đúng vậy. Trong bất kỳ phạm vi đối tượng địa phương cụ thể nào bị phá hủy theo thứ tự ngược lại, chúng được xây dựng.

11

Có, các trình phá hủy được gọi theo thứ tự ngược lại của xây dựng.

11

Thêm vào câu trả lời của Neil.

Hãy xem xét điều ngược lại có đúng hay không, đó là bạn không thể dự đoán thứ tự hủy cho các biến được khai báo ngăn xếp. Điều đó sẽ làm cho nó gần như không thể sử dụng các loại giá trị phụ thuộc vào ngăn xếp. Hãy xem xét

void Foo() { 
    Type1 t1; 
    Type2 t2(&t1); 
    ... 
} 

Nếu C++ không đảm bảo trật tự hủy, mã chuyển tiếp thẳng như thế này sẽ vô cùng không an toàn vì nó có thể bị phá hủy trước khi t2 bị hủy. Do đó bạn không thể đảm bảo destructor của t2 chạy với giá trị t1 hợp lệ.

+0

Câu trả lời hay. Tôi có một số mã dựa trên thứ tự của các cuộc gọi destructor và tôi đã tìm kiếm một lý do vững chắc tại sao họ luôn được đặt hàng theo một cách cụ thể trước khi tin tưởng mã của tôi là đúng. –

3

Câu hỏi đã được trả lời đã có, nhưng tôi muốn thêm rằng tôi thường có thói quen viết một cái gì đó như thế này:

void PerformLogin() 
{ 
    ScopeLock <Lock> LoginLock(&m_LoginLock); 
    doLoginCommand(); 

    { 
     ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 
     doStoreLogin(); 
     ... 
    } 
} 

Theo tôi, điều này làm cho mục đích rõ ràng hơn (*). Điều đó có thể có liên quan nếu mã của bạn thực sự là dựa trên theo thứ tự cụ thể. Tôi thấy rằng điều này khiến ít khả năng ai đó vô tình thay đổi thứ tự và gây ra lỗi khó tìm. (Vâng, đó là tất nhiên là không vấn đề, vì tất cả chúng ta đều có các thử nghiệm tại chỗ, phải không?)

Tôi luôn viết các dấu ngoặc thừa thừa trong một cái gì đó giống như   và tôi thấy vấn đề này khá giống.

(*): Tất nhiên, bạn cũng có thể sử dụng nhận xét.

0

Có, trình phá hủy là sự đảo ngược của các nhà xây dựng. Bởi vì destructors được sử dụng để xóa các đối tượng không còn cần thiết và constructor được sử dụng để tạo các đối tượng.

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