Tôi đang nghĩ đến việc thực hiện một lớp đại diện cho sở hữu của một đồng bộ hóa ban, một cái gì đó như thế này:Người dân địa phương có bị phá hủy trước hoặc sau khi đánh giá giá trị trả về của hàm không?
class CCriticalSectionLock
{
public:
CCriticalSectionLock(CCriticalSection &cs) : cs(cs)
{ cs.Enter(); }
~CCriticalSectionLock()
{ cs.Leave(); }
private:
CCriticalSection &cs;
};
này trông giống như một cách tốt để có thể mất quyền sở hữu trong một chức năng và đảm bảo quyền sở hữu được phát hành ngay cả khi có nhiều điểm thoát hoặc ngoại lệ. Nó không, tuy nhiên, nâng cao một số vấn đề tinh tế về chính xác khi trình biên dịch sẽ có những thứ khác nhau đánh giá. Hãy xem xét việc sử dụng sau đây:
int MyMethod(void)
{
not_locked(); // do something not under lock
CCriticalSectionLock myLock(someCriticalSection);
locked(); // do something under lock
return ...; // some expression
}
AFAIK, C quy tắc cuộc đời ++ sẽ đảm bảo rằng not_locked()
sẽ được gọi là trước khóa được thực hiện, và rằng locked()
sẽ được gọi trong khi khóa được tổ chức.
Tuy nhiên, những gì tôi không rõ ràng là chính xác khi biểu thức được trả lại sẽ được đánh giá đối với điểm mà tại đó trình phá khóa khóa được gọi là. Có đảm bảo rằng biểu thức sẽ được đánh giá trước trình hủy không? Tôi sẽ nghĩ như vậy nhưng tôi không chắc chắn 100%, và nếu không nó có thể dẫn đến lỗi rất tinh tế, liên tục, khó tìm!
Trùng lặp: [Điều gì đến trước - ngăn xếp thư giãn hoặc sao chép các giá trị trả lại] (http://stackoverflow.com/q/8923018/220636) – nabulke
@nabulke Vì vậy, đó là lý do tại sao tôi không tìm thấy bất cứ điều gì ... tôi đã tìm kiếm sự phá hủy/đánh giá nhưng điều đó đã được ẩn dưới thư giãn/sao chép. – Kevin