Tôi đang trong quá trình chuyển một số mã từ Mục tiêu C sang C++. Tôi không phải là quen thuộc với các mẫu thiết kế C++ như tôi với Objective C. Trong thế giới ca cao, có một mô hình rất phổ biến của việc viết một phương thức factory trả về một đối tượng "autoreleased". Những điều đơn giản như:Mục tiêu C "autorelease" trong C++ - cách tiêu chuẩn để kiểm soát tuổi thọ đối tượng?
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
Điều này rất đơn giản và dễ hiểu. Phương thức này sở hữu bộ nhớ mà nó phân bổ, nhưng có thể trao lại cho người gọi, đồng thời từ bỏ quyền sở hữu. Nó không phải biết hoặc quan tâm những gì người gọi làm với bộ nhớ đó. Nếu nó giữ lại nó, vật thể sẽ tồn tại. Nếu nó hoàn toàn bị bỏ qua, bộ nhớ sẽ được giải phóng đôi khi sau khi stack cuộc gọi hiện tại là unwound.
Tôi đang tiếp cận điều này với một số lo ngại trong C++, vì môi trường không được tính lại của nó dường như không có bất kỳ thứ gì sạch sẽ như autorelease
hoặc bất kỳ loại chính sách quyền sở hữu nào được xác định rõ ràng Khung cacao. Các phương pháp hay nhất cho loại mẫu này trong C++ là gì?
Tôi biết về auto_ptr, nhưng cũng có rất nhiều mối quan tâm với việc sử dụng nó và có vẻ như có quá nhiều thiếu sót ở khắp mọi nơi như autorelease
(ngữ nghĩa sao chép lạ, không hỗ trợ mảng, không tương thích với vùng chứa STL , v.v.)
Boost con trỏ thông minh cũng là một ứng cử viên rõ ràng, và một số thậm chí thực hiện tính tham khảo riêng của họ. Có vẻ hơi lạ khi tôi phải dựa vào một thư viện của bên thứ ba cho thứ gì đó trần tục này.
Một tùy chọn khác mà reeks của C sẽ chỉ là không giải phóng bộ nhớ đã trả về, nhưng cho biết thông qua quy ước đặt tên thông thường mà người gọi hiện đang sở hữu đối tượng được trả về. Điều này có vẻ hơi cổ xưa, và dễ bị rò rỉ vô hình nên người gọi vô tình bỏ qua giá trị trả về.
"Có vẻ như hơi lạ khi tôi phải dựa vào thư viện của bên thứ ba cho thứ gì đó trần tục này." Làm quen với nó. Đó là cách mọi thứ được thực hiện trong C++: bạn tìm thấy các thư viện làm những gì bạn cần, và bạn sử dụng chúng. Quyền sở hữu trí nhớ không phải là cú pháp trong C++; đó là * luôn luôn * thủ công. –