C++Primer 학습: 스마트 포인터와 동적 메모리(2)
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());
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.