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
5
A
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
Các vấn đề liên quan
- 1. Sử dụng Boost Python & std :: shared_ptr
- 2. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 3. Sử dụng deleter tùy chỉnh với std :: shared_ptr
- 4. Sử dụng luabind và std :: shared_ptr với thừa kế
- 5. shared_ptr in std :: tr1
- 6. Làm thế nào để giải quyết xung đột giữa tăng :: shared_ptr và sử dụng std :: shared_ptr?
- 7. Tôi có nên kiểm tra tăng :: shared_ptr hoặc std :: shared_ptr trước khi tôi sử dụng không?
- 8. Làm thế nào để xử lý phát triển C++ std :: namespace? ví dụ: std :: tr1 :: shared_ptr so với std :: shared_ptr so với boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 9. Làm thế nào để kết hợp việc sử dụng std :: ràng buộc với std :: shared_ptr
- 10. Bạn có sử dụng std :: shared_ptr <std::vector> thay vì tăng :: shared_array không?
- 11. Tôi không thể sử dụng std :: vector của auto_ptr - tôi nên sử dụng shared_ptr?
- 12. Sử dụng boost shared_ptr
- 13. Clang, std :: shared_ptr và std :: ít/operator <
- 14. C++ 11: mở rộng std :: is_pointer thành std :: shared_ptr
- 15. lý do tại sao là std :: shared_ptr sử dụng các hoạt động cpu nguyên tử
- 16. Cuộc gọi destructor kép lạ khi sử dụng shared_ptr
- 17. std :: shared_ptr không hoạt động với phạm vi cho
- 18. using std :: shared_ptr với một constructor \ destructor bảo vệ
- 19. shared_ptr của boost là gì (shared_ptr <Y> const & r, T * p) được sử dụng cho?
- 20. Đúc shared_ptr <T> để shared_ptr <void>
- 21. cách tăng :: shared_ptr hoạt động?
- 22. Cách sử dụng đúng std :: reference_wrappers
- 23. C++ phân bổ shared_ptr với C++ 11 (std :: shared_ptr): Vẫn còn xấu để khởi tạo shared_ptr thành một biến tạm thời?
- 24. Có hợp pháp không khi sử dụng tr1 :: shared_ptr trong không gian tên std trong tiêu đề?
- 25. shared_ptr & weak_ptr chuyển đổi
- 26. Khi sử dụng shared_ptr nên tôi chỉ sử dụng khai báo shared_ptr một lần hoặc khai báo shared_ptr ở mọi nơi tôi vượt qua nó?
- 27. Có std :: make_shared() sử dụng phân bổ tùy chỉnh?
- 28. Cách sắp xếp vùng chứa std :: shared_ptr <Widget> objects?
- 29. QList và shared_ptr
- 30. Sử dụng một std :: unordered_set của std :: unique_ptr
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
@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 –
@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