C 有指標成員的類如何拷貝 賦值該類物件

2021-08-22 14:53:42 字數 1257 閱讀 5493

當乙個帶有指標成員*b的類a被拷貝或賦值給b時,該指標所指向的記憶體多出乙個指標b.b,這樣,當a 物件析構時,刪除了a.b所指向的記憶體,這時,當b析構時,利用delete 釋放b.b指向的記憶體時發現要釋放的記憶體不存在,會導致錯誤。

class publisher ;

class book

~book()

private:

int val = 0;

publisher *pub;

};void fun(book b)

int main()

執行上述**會出現如下錯誤:

解決方案:智慧型指標

這時可以用乙個類來管理這種類(我簡稱為c)的指標成員釋放問題,稱該類為u,類u(它不需要進行拷貝賦值等操作)有乙個指標成員和乙個計數器,該指標會被賦值為類c的指標成員,計數器初始值為1,表示某塊記憶體肯定被指標成員指向著。

當類c的物件a拷貝給物件b時(假設a的指標成員指向sp記憶體),此時,sp記憶體會對多乙個指標指向它,此時,a成員的智慧型指標派上用場,將a的指標計數器加1,同時將a的所有成員賦值給b,如果物件b賦值給a時(此時,b和a的指標成員不一定指向同一塊記憶體),故a的指標成員計數器減一,b的指標成員計數器加1,類c析構時,要判斷智慧型指標u型別的成員計數器減一後是否為0,是0則刪除類c的指標成員,否則不進行刪除。這樣,當多次析構時,該計數器已經為負,則不會進行釋放無效記憶體。

下面是完整**:

#include#include#include#includeusing namespace std;

template class u_ptr

~u_ptr()

private:

t *ptr;

};class publisher ;

class book

~book()

book(const book& b)

book& operator=(const book& b)

val = b.val;

ptr = b.ptr;

}private:

int val = 0;

publisher *pub;

u_ptr*ptr;

};void fun(book b)

int main()

含有指標成員的類的拷貝

題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。template class array array voidsetvalue unsigned index,const t value t getvalue unsignedindex const pri...

含有指標成員的類的拷貝

題目 下面是乙個陣列類的宣告與實現。請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。1 templateclass array29 10 array 1114 15void setvalue unsigned index,const t value 1620 21 t getvalue u...

C 類的賦值和拷貝

include stdafx.h include include class a a a int id,char username id id username username a a a 過載拷貝函式 a operator a b 過載賦值函式,形參為引用,避免了一次物件的拷貝構造 或者 我們也...