類包含乙個指向成員複製
稱號:下面是類和執行的陣列的宣告。題。並針對存在的問題提出幾種解決方式。
templateclass array
~array()
void setvalue(unsigned index, const t& value)
t getvalue(unsigned index) const
private:
t* data;
unsigned size;
};
分析:我們注意在類的內部封裝了用來儲存陣列資料的指標。軟體存在的大部分問題通常都能夠歸結指標的不對處理。
這個類僅僅提供了乙個建構函式。而未定義構造拷貝函式和過載拷貝運算子函式。當這個類的使用者依照以下的方式宣告並例項化該類的乙個例項:
array a(10);
array b(a);
或者依照以下的方式把該類的乙個例項賦值給另外乙個例項
array a(10);
array b(10);
b=a;
編譯器將呼叫其自己主動生成的構造拷貝函式或者拷貝運算子的過載函式。在編譯器生成的預設的構造拷貝函式和拷貝運算子的過載函式,對指標實行的是按位拷貝,只不過拷貝指標的位址,而不會拷貝指標的內容。因此在執行完前面的**之後。a.data和b.data指向的同一位址。當a或者b中隨意乙個結束其生命週期呼叫析構函式時,會刪除data。因為他們的data指向的是同乙個地方。兩個例項的data都被刪除了。
但另外乙個例項並不知道它的data已經被刪除了,當企圖再次用它的data的時候,程式就會不可避免地崩潰。
因為問題出現的根源是呼叫了編譯器生成的預設構造拷貝函式和拷貝運算子的過載函式。乙個最簡單的辦法就是禁止使用這兩個函式。於是我們能夠把這兩個函式宣告為私有函式,假設類的使用者企圖呼叫這兩個函式,將不能通過編譯。實現的**例如以下:
private:
array(const array& copy);
const array& operator = (const array& copy);
最初的**存在問題是由於不同例項的data指向的同一位址,刪除乙個例項的data會把另外乙個例項的data也同一時候刪除。因此我們還能夠讓構造拷貝函式或者拷貝運算子的過載函式拷貝的不僅僅是位址,而是資料。由於我們又一次儲存了乙份資料,這樣乙個例項刪除的時候,對另外乙個例項沒有影響。這樣的思路我們稱之為深度拷貝。實現的**例如以下:
public:
array(const array& copy) :data(0), size(copy.size)
}const array& operator = (const array& copy)
size = copy.size;
if (size > 0)
}
為了防止有多個指標指向的資料被多次刪除,我們還能夠儲存到底有多少個指標指向該資料。僅僅有當沒有不論什麼指標指向該資料的時候才幹夠被刪除。
這樣的思路通常被稱之為引用計數技術。
在建構函式中,引用計數初始化為
1;每當把這個例項賦值給其它例項或者以引數傳給其它例項的構造拷貝函式的時候。引用計數加
1,由於這意味著又多了乙個例項指向它的
data
;每次須要呼叫析構函式或者須要把
data
賦值為其它資料的時候,引用計數要減
1,由於這意味著指向它的
data
的指標少了乙個。
當引用計數降低到0
的時候,
data
已經沒有不論什麼例項指向它了,這個時候就能夠安全地刪除。
實現的**例如以下:
public:
array(unsigned arraysize)
:data(0), size(arraysize), count(new unsigned int)
array(const array& copy)
: size(copy.size), data(copy.data), count(copy.count)
~array()
const array& operator = (const array& copy)
private:
void release()
delete count;
count = 0;}}
unsigned int *count;
經典揹包系列問題
揹包問題i 試題描述 有乙個揹包容積為 v 和 n 個物品,並給出每個物品有乙個體積。要求從 n 個物品中,任取若干個裝入揹包內,使揹包的剩餘空間為最小。輸入第一行兩個正整數 v 和 n,分別表示揹包的容積和待裝物品的個數 第二行包括 n 個正整數,表示 n 個物品的體積,兩兩之間有乙個空格分隔。輸...
C C 校招筆試面試經典題目總結六
解析 const int minnumber 32767 int find sec max int data int count else return sec max 解析 第一種 include using namespace std void main define int ptr int t...
經典演算法問題之指標碰撞系列
注釋 q question a answer c code q 1 陣列裡面只有0,1,2,排成順序的陣列 a 最簡單的方法是遍歷 簡單到不敢相信,當然這不是最好的方法 三路快排的方法。c 三路快排 陣列裡面有3種數字,0,1,2 排成順序 時間複雜度 o n 空間為 o 1 public stat...