2012-03-26 35 views
5

Làm cách nào để sử dụng lệnh std :: shared_ptr cho mảng tăng gấp đôi? Ngoài ra những lợi thế/bất lợi của việc sử dụng shared_ptr là gì.Cách sử dụng std :: shared_ptr

+1

Bạn không sử dụng 'std :: shared_ptr' cho mảng được phân bổ động, nó không gọi đúng 'delete'. Bạn có thể muốn 'std :: vector '. – birryree

+1

@birryree: Về mặt kỹ thuật, bạn có thể đi theo tiêu chuẩn :: shared_ptr > nếu ngữ nghĩa quyền sở hữu được chia sẻ là quan trọng đối với bạn. Hoặc Shared_array của Boost. Xem câu hỏi này ví dụ: http://stackoverflow.com/questions/6796655/why-use-one-vs-the-other-boostshared-array-vs-boostshared-ptrstdvecto –

+2

@StuartGolodetz - điểm tốt về ngữ nghĩa quyền sở hữu. piyush314 sẽ phải biết rằng 'shared_array' là một cấu trúc Boost (không chuẩn), và nếu anh ta thực sự, thực sự muốn một mảng được cấp phát thô, anh ta có thể sử dụng đối số' std :: default_delete 'cho dấu phân cách con trỏ, như sau: 'std :: shared_ptr tên (new double [size], std :: default_delete ());'. – birryree

Trả lời

9

Tùy thuộc vào những gì bạn đang theo dõi. Nếu bạn chỉ muốn một mảng thay đổi kích thước của đôi, đi với

std::vector<double> 

Ví dụ:

std::vector<double> v; 
v.push_back(23.0); 
std::cout << v[0]; 

Nếu chia sẻ quyền sở hữu của vấn đề mảng nói với bạn, sử dụng ví dụ

std::shared_ptr<std::vector<double>> 

Ví dụ:

std::shared_ptr<std::vector<double>> v1(new std::vector<double>); 
v1->push_back(23.0); 
std::shared_ptr<std::vector<double>> v2 = v1; 
v2->push_back(9.0); 
std::cout << (*v1)[1]; 

Ngoài ra, Boost có

boost::shared_array 

phục vụ một mục đích tương tự. Xem ở đây:

http://www.boost.org/libs/smart_ptr/shared_array.htm

Theo như một vài ưu điểm/nhược điểm của shared_ptr đi:

Ưu

  • Automated chia sẻ deallocation tài nguyên dựa trên tính tham khảo - giúp tránh rò rỉ bộ nhớ và khác các vấn đề liên quan đến những thứ không được giải quyết khi chúng phải là
  • Có thể giúp viết mã an toàn ngoại lệ dễ dàng hơn

Nhược điểm

  • Memory nguyên cần thiết để lưu trữ số lượng tài liệu tham khảo có thể là đáng kể cho các đối tượng nhỏ
  • Hiệu suất có thể tồi tệ hơn cho con trỏ thô (nhưng biện pháp này)
6

Bạn cũng có thể cung cấp số array deleter:

template class ArrayDeleter { 
public: 
    void operator() (T* d) const 
    { delete [] d; } 
}; 

int main() 
{ 
    std::shared_ptr array (new double [256], ArrayDeleter()); 
} 
+1

Bạn cũng có thể chỉ cần sử dụng lambda, tôi nghĩ: 'std :: shared_ptr mảng (new double [256], [] (double * d) {delete [] d;}); '. –

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