1.std::auto_ptr
屬於stl在命名空間std下包含在標頭檔案下
(1)使用時盡量不使用=賦值,即使使用了也不要再用之前的物件
1
2
3
4
5
6
7
8
9
void
testautoptr2()
}
最終如上**導致崩潰,如上**時絕對符合 c++ 程式設計思想的,居然崩潰了,跟進 std::auto_ptr 的原始碼後,我們看到,罪魁禍首是「my_memory2 = my_memory」,這行**,my_memory2 完全奪取了 my_memory 的記憶體管理所有權,導致 my_memory 懸空,最後使用時導致崩潰。
(2) 記住 release() 函式不會釋放物件,僅僅歸還所有權。
1
2
3
4
5
6
7
void
testautoptr3()
}
執行結果為:?
1******: 1
看到什麼異常了嗎?我們建立出來的物件沒有被析構,沒有輸出「~******: 1」,導致記憶體洩露。當我們不想讓 my_memory 繼續生存下去,我們呼叫 release() 函式釋放記憶體,結果卻導致記憶體洩露(在記憶體受限系統中,如果my_memory占用太多記憶體,我們會考慮在使用完成後,立刻歸還,而不是等到 my_memory 結束生命期後才歸還)。
正確的**應該為:?
12
3
4
5
6
7
void
testautoptr3()
}
或? 1
2
3
4
5
6
void
testautoptr3()
}
原來 std::auto_ptr 的 release() 函式只是讓出記憶體所有權
2.shared_ptr
shared_ptr用法
示例一:
[cpp]view plain
copy
shared_ptr sp(new
int(10)); //乙個指向整數的shared_ptr
assert(sp.unique()); //現在shared_ptr是指標的唯一持有者
shared_ptr sp2 = sp; //第二個shared_ptr,拷貝建構函式
assert(sp == sp2 && sp.use_count() == 2); //兩個shared_ptr相等,指向同乙個物件,引用計數為2
*sp2 = 100; //使用解引用操作符修改被指物件
assert(*sp == 100); //另乙個shared_ptr也同時被修改
sp.reset(); //停止shared_ptr的使用
assert(!sp); //sp不再持有任何指標(空指標)
示例二:
[cpp]view plain
copy
class shared //乙個擁有shared_ptr的類
//建構函式初始化shared_ptr
void print() //輸出shared_ptr的引用計數和指向的值
};
void print_func(shared_ptr p) //使用shared_ptr作為函式引數
int main()
結論:在將shared_ptr用於函式引數時,會拷貝指標,增加其引用指數,函式結束後,引用計數減少。
關於智慧型指標
讀 c stragegies and tacitics 的時候看到了一段很nb的 是關於智慧型指標的 程式稍作修改,以便在編譯器上執行 1 include 2using namespace std 34 class string ptr 9string operator const 10operat...
關於C 智慧型指標
普通指標到智慧型指標的轉換 int iptr new int 42 shared ptrp iptr 智慧型指標到普通指標的轉換 int pi p.get 注意的地方 那就是不要將智慧型指標與普通指標混用。如果專案允許,堅持使用智慧型指標,避免原生指標。智慧型指標與普通指標需要特別特別特別的小心翼翼...
關於智慧型指標auto ptr
智慧型指標auto ptr和shared ptr也是面試中經常被問到的乙個 感覺看auto ptr的原始碼反而更加容易理解一些,因為原始碼的 量並不大,而且比較容易理解。本篇主要介紹auto ptr 其特點如下 1.首先auto ptr智慧型指標是個封裝好的類 2.是採用棧上的指標去管理堆上的內容,...