2010-10-26 22 views
6

Hiện tại tôi muốn tạo lớp trình bao bọc trong môi trường đa luồng. Mục đích của lớp là đơn giản - Lấy một khóa trên cấu trúc của nó và thả một khóa vào sự hủy diệt của nó. Khác hơn thế, nó giống với một con trỏ bình thường. Hơn nữa, tôi muốn ngăn chặn nó được tạo ra trên khu vực heap để đảm bảo rằng khóa sẽ được phát hành cuối cùng.Biến chỉ có ngăn xếp có thể có trong C++ không?

Nghịch đảo khá dễ (hàm tạo riêng với phương thức factory), nhưng tôi không biết rằng biến chỉ có ngăn xếp là có thể. Không có cách nào khác ư?

+2

Tôi nghĩ rằng những thứ như thế này là không cần thiết. Mỗi lập trình viên giỏi nên biết sử dụng mới/xóa rủi ro của riêng mình. Nếu lập trình viên muốn đối tượng này trên heap và vứt bỏ điểm của sự tồn tại của lớp, hãy để chúng. –

+0

Điều bạn đang yêu cầu là không thể và không cần thiết. Nếu một lập trình viên không đủ năng lực sử dụng mã của bạn, họ sẽ quản lý để phá vỡ ứng dụng của riêng họ * anyway *. Và nếu họ có thẩm quyền, thì họ sẽ phân bổ đối tượng khóa của bạn theo cách nó có ý nghĩa: trong một bối cảnh phức tạp. – jalf

+5

"Bảo vệ chống lại Murphy, chứ không phải Machiavelli" - Herb Sutter – MSalters

Trả lời

12

Vâng, còn bạn quá tải operator new cho lớp học của bạn và lưu trữ riêng tư thì sao?

+0

Cảm ơn. Tôi đã hoàn toàn bị lãng quên về nhà điều hành mới cho đến bây giờ! Mặc dù nó có thể không hoàn toàn ngăn không cho nó tạo ra trên vùng heap (vì nó có thể là một biến thành viên trong một đối tượng được tạo bởi toán tử mới), nhưng nó sẽ hữu ích để ngăn chặn nhiều sai lầm. – summerlight

+0

@summerlight: Tôi tin rằng nó là không thể hoàn thành ngăn chặn nó được tạo ra trên đống thời gian biên dịch hoặc portably. –

+4

yup, ngay cả với một toán tử 'private new', nó sẽ giống như 5 dòng mã để viết một đối tượng bao bọc mà * chứa * đối tượng của bạn và có thể được cấp phát trên heap. Như thường lệ khi viết mã thư viện C++, bạn không thể quyết định cách người dùng * phải * sử dụng nó. Bạn phải giả định rằng người dùng thư viện là lành mạnh và sẽ không thực sự cố gắng phá vỡ chương trình của riêng mình. Và nếu bạn đưa ra giả định đó, thì bạn không * cần * để làm cho nó không thể phân bổ đối tượng của bạn. – jalf

0

Tôi không hiểu vấn đề? Bất kỳ biến nào được xác định trong phạm vi của hàm đều chỉ là ngăn xếp.

class Lock { 
public: 
    Lock() { 
     performLock(); 
    } 

    ~Lock() { 
     performUnlock(); 
    } 
} 

void foo() { 
    // ... Code 
    Lock onStackOnly; 
    // ... Code that is locked 
} 


void foo() { 
    // ... Code 
    { 
     Lock onStackOnly; 
     // ... Code that is locked 
    } 

    // This code is unlocked. 
} 
+0

"Tôi muốn ngăn không cho nó được tạo trên vùng heap". Anh ta muốn 'khóa mới();' không thể là –

+3

câu hỏi của anh ta là về cách buộc biến được xác định trong phạm vi của một khối và để ngăn chặn bất kỳ sự khởi tạo nào trên vùng heap. – BatchyX

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