題目在書p105頁
#include
#include
#include
using
namespace std;
class
cdemo;~
cdemo()
;char
* str;}};
intmain
(int argc,
char
** ar**)
上面這個問題就是淺拷貝的問題
cdemo中沒有具體的拷貝建構函式時,會呼叫預設的拷貝建構函式,就是淺拷貝。
可以通過深拷貝解決這個問題,在cdemo中加入自己定義的拷貝建構函式
cdemo
(const cdemo &cd)
函式在執行到a1 -> push_back(d1);所以,深拷貝就是開闢一塊新的記憶體,防止重複delete呼叫自己的拷貝建構函式建立的dl_1,會在堆疊中申請另外的記憶體,而不是直接指向d1.str所指向的記憶體位址。
當**執行到delete a1的時候,vector呼叫了物件的析構函式~cdemo(),delete掉的是dl_1申請的記憶體(深拷貝實現)。
當**執行完,需要析構 d1 的時候,delete掉的是d1.str = new char[32]; 沒有重複delete。
參考:面試寶典上的vector二次析構問題
還有一些vector容量限制時,插入元素時拷貝構造函式呼叫的例子,如下文:
stl容器與拷貝建構函式
面試寶典上的vector析構函式
面試寶典上的vector析構函式 2009 10 09 11 00 include using namespace std class cdemo cdemo char str int main 書上說這段程式的錯誤是vector物件指標能夠自動析構,所以不需要呼叫delete a1,否則會造成兩次...
面試寶典上的vector二次析構問題
今天看面試寶典chap 9 stl模板與容器時,有一道面試題講vector二次析構出錯的,看了解答還不是很明白,經過google之後終於搞清楚了,記錄如下 面試寶典上的vector二次析構問題 include using namespace std class cdemo cdemo char st...
常見筆 面試題 之建構函式和析構函式
建構函式是用來初始化乙個物件的,而析構函式的作用則是釋放物件占用的空間。如果將虛函式 建構函式和析構函式結合起來會有怎麼樣的效果呢?建構函式可以是虛函式嗎?答 建構函式不可以是虛函式!基於以下幾點原因 1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間動態確定實際型別的。在構建...