C 智慧型指標

2021-07-25 19:29:59 字數 4504 閱讀 6916

int main()

有時候忘記寫delete,或者寫了,但在程式執行過程中由於某種原因,提前結束了,會造成丟失記憶體

所以,建議使用智慧型指標,不使用裸指標,智慧型指標的資源一定會被釋放,不用自己寫delete

智慧型指標代替普通指標,最基本要提供*運算子和->運算子的過載函式

問題:出現淺拷貝

//解決淺拷貝——拷貝構造

雖然問題解決了,但這樣寫不好,*p3 = 200;是給_ptr = new t;的那塊記憶體進行了賦值,沒有意義。

c++庫里有乙個智慧型指標auto_ptr,可以仿照它,加乙個標誌位

templateclass csmartptr

const t* operator->()const

void release()const

private:

//標誌位,控制對資源的擁有者,才可以釋放

但這種寫法只能控制乙個資源,多種資源時就不能使用這種方法了。需要使用帶有引用計數的智慧型指標,方便管理資源的開闢和釋放,乙個資源配乙個引用計數。

//引用計數資源的管理類

class cheapmanager

throw"no resource!";

}private:

//資源結點型別

struct resitem

}bool operator==(void *ptr)

void *_paddr;//記錄資源位址

int _refcount;

}; vector_vec;//用來插入、刪除、查詢,存放資源

};templateclass csmartptr

} ~csmartptr()//釋放資源

//拷貝構造

csmartptr(const csmartptr&src):_ptr(src._ptr) }

//賦值運算子過載

csmartptr& operator=(const csmartptr&src)

return *this;

} t& operator*()

const t& operator*()const

t* operator->()

const t* operator->()const

void addref()

void delref()

int getref()

private:

t *_ptr;

//帶有引用計數的智慧型指標,方便管理資源的開闢和釋放

//乙個資源配乙個引用計數

static cheapmanager _heapmanager;//必須在類外初始化

出現問題:同一塊記憶體釋放了兩次,智慧型指標p1,p2的型別不同導致_heapmanager不同,相當於有兩個管理者,兩個都認為這個資源是自己管理的乙個新資源

所謂靜態成員變數,是指同一類物件所共享。

怎麼讓不同型別例項化的智慧型指標擁有同乙個_heapmanager??

1.定義成全域性的

2.採用設計模式   單例模式

用單例模式設計_heapmanager,類不管怎麼產生物件,都只產生乙個物件。

限制使用者不能隨意構造物件,所以第一步要把建構函式寫成私有的。

//引用計數資源的管理類

class cheapmanager

void addref(void *ptr)

throw"no resource!";

}private:

//建構函式寫成私有

cheapmanager(){}

//資源結點型別

struct resitem

}bool operator==(void *ptr)

void *_paddr;//記錄資源位址

int _refcount;

}; vector_vec;//用來插入、刪除、查詢,存放資源

};templateclass csmartptr

} ~csmartptr()//釋放資源

//拷貝構造

csmartptr(const csmartptr&src):_ptr(src._ptr) }

//賦值運算子過載

csmartptr& operator=(const csmartptr&src)

return *this;

} t& operator*()

const t& operator*()const

t* operator->()

const t* operator->()const

void addref()

void delref()

int getref()

private:

t *_ptr;

//用單例模式設計_heapmanager

static cheapmanager &_heapmanager;//用&

問題1:getitance()是不是乙個可重入的函式?

是執行緒安全的

問題2:那這種情況呢?

int i;

//建構函式寫成私有

cheapmanager()

不是執行緒安全的,static cheapmanager _heapmanager;會呼叫建構函式,建構函式中有競態條件發生。

那怎麼寫成執行緒安全的?

class cheapmanager

void addref(void *ptr)

throw"no resource!";

}private:

//建構函式寫成私有

cheapmanager(){}

static cheapmanager _heapmanager;

//資源結點型別

struct resitem

}bool operator==(void *ptr)

void *_paddr;//記錄資源位址

int _refcount;

}; vector_vec;//用來插入、刪除、查詢,存放資源

};cheapmanager cheapmanager::_heapmanager;//初始化

此時就是執行緒安全的。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...