Trong Scott Meyers của Effective C++, mục 18 Hãy giao diện dễ sử dụng một cách chính xác và khó sử dụng không đúng cách, ông đề cập đến shared_ptr null:Tại sao người ta cần một shared_ptr null và làm thế nào nó có thể được sử dụng?
std::tr1::shared_ptr<Investment> pInv(static_cast<Investment*>(0), getRidOfInvestment)
và một toán tử gán vogue
pInv = ... //make retVal point to the correct object
Trong trường hợp nào người ta có thể cần phải tạo ra một shared_ptr null và làm bài tập sau? Tại sao không chỉ tạo shared_ptr bất cứ khi nào bạn có tài nguyên (con trỏ thô)?
Kể từ khi Scott Meyers không cho thấy sự phân công hoàn thành trong ví dụ trước, tôi nghĩ điều hành assign của shared_ptr bị quá tải mà ta có thể làm điều này:
pInv = new Investment; // pInv will take charge of the pointer
// but meanwhile keep the delete function it already had
Nhưng tôi đã cố gắng với tăng 's thực hiện nó không hoạt động theo cách này. Vậy ý nghĩa của việc có null shared_ptr là gì?
Tôi gần như chắc chắn rằng tôi đang thiếu điều gì đó ở đây, một người nào đó giúp tôi ra khỏi nó xin vui lòng.
ps. thêm về khởi tạo và phân công một shared_ptr
#include <boost/shared_ptr.hpp>
int main(int argc, char *argv[])
{
boost::shared_ptr<int> ptr1(new int);
boost::shared_ptr<int> ptr2;
ptr2.reset(new int);
boost::shared_ptr<int> ptr3 = new int;
return 0;
}
ví dụ này không thể được biên soạn bởi g ++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 và thúc đẩy mới nhất:
sptr.cpp: In function ‘int main(int, char**)’:
sptr.cpp:8:39: error: conversion from ‘int*’ to non-scalar type ‘boost::shared_ptr<int>’ requested
Tôi cố gắng để con số nó ra ở đây: http://ideone.com/BUjOwZ. Tôi không thể đưa ra lời giải thích. –
Như những người khác đã chỉ ra, có rất nhiều lý do để cần một shared_ptr null, giống như bạn có null con trỏ thô. Nhưng bí ẩn thực sự là lý do tại sao Scott cảm thấy cần thiết cho nó để có một deleter tùy chỉnh. –