2013-04-11 21 views
9

Tôi cần tạo con trỏ của các cá thể của một lớp và chương trình không biết thời gian biên dịch sẽ tạo bao nhiêu con trỏ. Để xóa, tôi đã xem xét lưu trữ các con trỏ trong một vectơ, và sau đó xóa từng con một. Việc sử dụng các con trỏ thông minh có phải là cách dọn dẹp không? Và nếu không muốn sử dụng con trỏ thông minh, liệu việc sử dụng vectơ này có được coi là sạch sẽ không?Xóa véc tơ của con trỏ

đang tối thiểu:

#include <vector> 
using namespace std; 

class Foo { 
public: 
    Foo(); 
}; 
Foo::Foo(){} 
void createFooVector(int nb, std::vector<Foo*> &v){ 
    for(int i=0;i<nb;i++){ 
     Foo* f = new Foo(); 
     v.push_back(f); 
    } 
} 
int main(int argc, char *argv[]){ 
    std::vector<Foo*> v; 
    createFooVector(5,v); 
    while (!v.empty()){ 
     Foo* f = v.back(); 
     v.pop_back(); 
     delete f; 
    } 
} 
+2

Bạn có thực sự cần một hộp chứa con trỏ không? Bạn không thể lưu trữ các đối tượng 'Foo' của bạn làm giá trị (' std :: vector ')? Ngoài ra, sẽ không rõ ràng hơn nếu 'createFooVector' trả lại một vectơ mới thay vì sửa đổi một đối số đã cho làm đối số? –

+0

@LucTouraille Tôi sử dụng con trỏ vì lý do này: http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-clean-way-to-go ... điều này có thể không được nhìn thấy trong mã tôi hiển thị ở đây mặc dù, cố gắng giữ cho nó tối thiểu – Vince

Trả lời

3

tôi sẽ đề nghị một trong hai cách sử dụng một boost::pointer_vector, một std::vector<std::unique_ptr<Foo>>, hoặc tung ra riêng lớp Foo quản lý của bạn mà giữ một vector<Foo*> và chăm sóc xóa trong constructor (bạn nên coi đây là giải pháp "chuyên gia", và chỉ có nỗ lực nếu bạn hoàn toàn hiểu được sự an toàn ngoại lệ). Bạn không muốn thực hiện xóa theo cách thủ công, điều đó có thể dễ dẫn đến lỗi.

+0

Tôi sẽ không khuyên bạn nên giải pháp quản lý mặc dù; cơ hội là OP sẽ không đủ an toàn đối với ngoại lệ ... –

+0

@MatthieuM. Rất đúng. Tôi đã thêm một cảnh báo về điều đó. – juanchopanza

1

Mã của bạn là tốt. Tuy nhiên, việc sử dụng con trỏ thông minh nên là lựa chọn ưu tiên (ít mã hơn để viết và ít cơ hội hơn cho các lỗi bộ nhớ).

1

Bạn có nên sử dụng con trỏ thông minh để dọn dẹp không?

Có.

Và nếu không muốn sử dụng con trỏ thông minh, liệu việc này có được coi là sạch sẽ không?

Tôi không có ý tưởng, tại sao ai đó không muốn sử dụng con trỏ thông minh trong C++, nếu nó không phải là bài tập về nhà ... Nhưng, tôi nghĩ, nó tốt hơn để sử dụng một cái gì đó giống như boost::pointer_containers trong trường hợp này.

1

Nếu bạn không sử dụng các lớp học có nguồn gốc từ FooFoo tương đối rẻ để sao chép cấu trúc, chỉ cần sử dụng vector<Foo>.

Nếu trình biên dịch của bạn hỗ trợ ngữ nghĩa di chuyển thì không có vấn đề gì.

+1

Cho dù đó là tốn kém để xây dựng các vấn đề nhỏ, tôi nghĩ rằng bạn đang suy nghĩ về việc đắt tiền để * sao chép *. Tuy nhiên, với ngữ nghĩa di chuyển, nó có thể không phải là một vấn đề ... và nếu tồi tệ nhất đến tồi tệ nhất, người ta có thể sử dụng thành viên 'emplace_back' mới. –

+0

@Matthieu Có, di chuyển ngữ nghĩa thay đổi mọi thứ. Để làm rõ ý tôi là gì, để đẩy một giá trị vào một véc-tơ, bạn phải xây dựng nó sau đó bản sao vectơ cấu tạo một véc tơ khác. Tôi muốn chỉ ra sự cần thiết phải xem xét việc xây dựng các giá trị nói chung. Tôi sẽ cập nhật để nói 'copy construct'. –