C++Primer 학습: 스마트 포인터와 동적 메모리(2)

7456 단어

unique_ptr, 그것도 지능 지침이지만, 어느 때는 유니크ptr는 주어진 대상을 가리킨다.


//정의 및 초기화
unique_ptr<int > p(new int(42));

p = nullptr;// 
p.release();// , . 
p.reset();// 
p.reset(q);// , q, p 
p.reset(nullptr);

weak_ptr는 대상의 생존 주기를 제어하지 않는 스마트 지침으로shared 를 가리킨다ptr 관리 대상;마지막으로 대상을 가리키는 sharedptr가 소각되면 대상이 풀려납니다. 즉시 weakptr가 대상을 가리킨다.이것은 리셋 (),lock (),expired () 등 구성원 함수를 제공하여 제어합니다.


연습:StrBlob의 포인터 클래스 정의:StrBlobPtr, weak 저장ptr, StrBlob을 가리키는 데이터 구성원.weak 사용ptr, 주어진 StrBlob가 가리키는 vector의 생존 주기에 영향을 주지 않습니다.현재 가리키는 대상의 하표를 저장하기 위해curr를 저장합니다.또한 StrBlob에 Begin () 을 추가했습니다. end () 구성원은 자신을 가리키는 StrBlobPtr 클래스를 되돌려줍니다.

class StrBlobPtr;
class StrBlob
{
    friend class StrBlobPtr;
public:
    // 
    StrBlob() :data(std::make_shared<vector<string>>()) {};// 
    StrBlob(initializer_list<string>il) : data(make_shared<vector<string>>(il)){};
    size_t size()const { return data->size(); };
    bool empty() const { return data->empty(); }
    void push_back(const string & s) { data->push_back(s); };
    void pop_back() { check(0, "pop_back on empty StrBlob"); data->pop_back(); };
    string & front(){ check(0, "front on empty strblob"); return data->front(); };
    string & back(){ "back on empty strblob"; return data->back(); };
    const string & front()const{ "front on empty strblob"; return data->front(); };
    const string & back()const{ "back on empty strblob"; return data->back(); };
    StrBlobPtr begin();// 
    StrBlobPtr end();// 

private:
    shared_ptr<vector<string>>data;// 
    void check(size_t , const string&)const;
};
void StrBlob:: check(size_t i, const string&msg)const
{
    if (i >= data->size())
        throw out_of_range(msg);
}

class StrBlob;
class  StrBlobPtr
{
public:
    StrBlobPtr() :curr(0){};
    StrBlobPtr(StrBlob & a, size_t sz = 0) :wptr(a.data), curr(sz){};
    string & deref() const;
    StrBlobPtr& incr();

private:
    weak_ptr<vector<string>> wptr;
    size_t curr;// 
    shared_ptr<vector<string>> check(size_t, const string&)const;
};
shared_ptr<vector<string>> StrBlobPtr::check(size_t i, const string& msg) const
{
    auto ret = wptr.lock();
    if (!ret)
        throw::runtime_error("unbound StrBlobPtr");// weak_ptr
    if (i >= ret->size())
        throw::out_of_range("msg");
    return ret;
}
string& StrBlobPtr::deref() const
{
    auto ret = check(curr, "deference past end");
    return (*ret)[curr];
}
StrBlobPtr& StrBlobPtr::incr()
{
    check(curr, "increment past end of StrBolbPtr");
    ++curr;
    return *this;
}
// StrBlob begin(),end()
StrBlobPtr StrBlob::begin()
{
    return StrBlobPtr(*this);
}
StrBlobPtr StrBlob::end()
{
    return StrBlobPtr(*this, data->size());
}

좋은 웹페이지 즐겨찾기