實現智慧型指標

2021-08-05 19:11:09 字數 3284 閱讀 5024

資源的轉移不推薦使用。

舊庫使用擁有者會導致野指標

實現**

template

class autoptr

autoptr(autoptr& ap)

:_ptr(ap._ptr)

autoptr& operator=(autoptr& ap)

return *this;

}~autoptr()

}t* getptr()

const t* getptr()const

t& operator*()

const t& operator*()const

t* operator->()

const t* operator->()const

private:

t* _ptr;

};

測試用例

void test_autoptr()

; autoptrap3(new a);

ap3->a = 2;

ap3->b = 3;

std::cout

<< (*ap3).a << std::endl;

std::cout

<< (*ap3).b << std::endl;

autoptrap4;

ap4 = ap3;

std::cout

<< (*ap4).a << std::endl;

std::cout

<< (*ap4).b << std::endl;

}

輸出結果

20202

323

unique_ptr 是 c++11 標識, scopedptr 是 boost庫提供 還有scopedaarray

實現**

template class scopedptr

~scopedptr()

}t* operator->()

const t* operator->()const

t& operator*()

const t& operator*()const

t* getptr()

const t* getptr()const

private:

scopedptr(const scopedptr&);

scopedptr& operator=(const scopedptr&);

private:

t* _ptr;

};

測試用例

void test_scopedptr()

; scopedptrsp4(new a);

sp4->a = 1;

sp4->b = 2;

std::cout

<< (*sp4).a << std::endl;

std::cout

<< (*sp4).b<< std::endl;

}

輸出結果

20

12

實現**

template class scopedarray

~scopedarray()

}t& operator(size_t index)

const t& operator(size_t index)const

private:

scopedarray(const scopedarray&);

scopedarray& operator=(const scopedarray&);

private:

t* _ptr;

};

測試用例

void test_scopedarray()

; scopedarrayspa4(new a[10]);

spa4[0].a = 1;

spa4[0].b = 2;

std::cout

<< spa4[0].a << std::endl;

std::cout

<< spa4[0].b << std::endl;

}

輸出結果

20

12

存在的問題,迴圈引用,weak_ptr解決。他不會占用引用計數,必須用乙個sharedptr來賦值。

shared 定製刪除器。 c++11 提供了 shared_ptr。boost提供了shared_ptr 和 sharedarray。

實現**

template

class sharedptr

explicit sharedptr(const sharedptr& sp)

:_ptr(sp._ptr)

, _pcount(sp._pcount)

sharedptr& operator=(const sharedptr& sp)

_ptr = sp._ptr;

_pcount = sp._pcount;

++(*_pcount);

}return *this;

}~sharedptr()

}unsigned

int usecount()const

t& operator*()

const t& operator*()const

t* operator->()

const t* operator->()const

t* getptr()

const t* getptr()const

private:

t* _ptr;

unsigned

int* _pcount;

};

測試用例

void test_shareddptr()

輸出結果

122

3144

智慧型指標實現

namespace smart smart count 增加引用計數,並返回計數值.intaddref 減少引用計數,並返回計數值.intrelease private 計數變數.intuse count 智慧型指標.template class t class smart ptr 構造空指標.ex...

C 智慧型指標實現

1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...

智慧型指標的實現

pragma once includeusing namespace std 原理 資源的轉移 解決的問題 釋放指標 缺陷 如果乙個指標通過拷貝構造和賦值運算子過載將管理的空間交給其他指標,則原指標是沒有辦法訪問這塊空間了 if 0 templateclass autoptr autoptr aut...