對(duì)于Visual C++開(kāi)發(fā)工具進(jìn)行學(xué)習(xí)指導(dǎo)
本文主要講述Visual C++,怎樣創(chuàng)建Visual C++項(xiàng)目。如何編制Visual C++的代碼,這些內(nèi)容都是一些門戶網(wǎng)站和技術(shù)論壇找到的,中間可能有不少錯(cuò)誤是我沒(méi)有挑出的,歡迎大家指正。
它將指針包裝成了類,并且重載了反引用(dereference)運(yùn)算符operator *和成員選擇運(yùn)算符operator ->,以模仿指針的行為。關(guān)于auto_ptr<>的具體細(xì)節(jié),參閱《The C++ Standard Library》(中譯本:C++標(biāo)準(zhǔn)庫(kù))。
例如以下Visual C++代碼,
- #include < cstring >
- #include < memory >
- #include < iostream >
- class string
- {
- public:
- string(const char* cstr) { _data=new char [ strlen(cstr)+1 ]; strcpy(_data, cstr); }
- ~string() { delete [] _data; }
- const char* c_str() const { return _data; }
- private:
- char* _data;
- };
- void foo()
- {
由于str是函數(shù)的局部對(duì)象,因此在函數(shù)退出點(diǎn)生存期結(jié)束,此時(shí)auto_ptr<string>的析構(gòu)函數(shù)調(diào)用,自動(dòng)銷毀內(nèi)部指針維護(hù)的string對(duì)象(先前在構(gòu)造函數(shù)中通過(guò)new表達(dá)式分配而來(lái)的),并進(jìn)而執(zhí)行string的析構(gòu)函數(shù),釋放為實(shí)際的字符串動(dòng)態(tài)申請(qǐng)的內(nèi)存。在string中也可能管理其他類型的資源,如用于多線程環(huán)境下的同步資源。下圖說(shuō)明了上面的過(guò)程。
- auto_ptr < string > str1( new string( < str1 > ) );
- cout << str1->c_str();
- auto_ptr < string > str2(str1); // str1內(nèi)部指針不再指向原來(lái)的對(duì)象
- cout << str2->c_str();
- cout << str1->c_str(); // 未定義,str1內(nèi)部指針不再有效
現(xiàn)在我們擁有了最簡(jiǎn)單的廢料收集機(jī)制(我隱瞞了一點(diǎn),在string中,你仍然需要自己編碼控制對(duì)象的動(dòng)態(tài)創(chuàng)建和銷毀,但是這種情況下的準(zhǔn)則極其簡(jiǎn)單,就是在構(gòu)造函數(shù)中分配資源,在析構(gòu)函數(shù)中釋放資源,就好像飛機(jī)駕駛員必須在起飛后和降落前檢查起落架一樣。),即使在foo函數(shù)中發(fā)生了異常,str的生存期也會(huì)結(jié)束,C++保證自然退出時(shí)發(fā)生的一切在異常發(fā)生時(shí)一樣會(huì)有效。
auto_ptr<>只是智能指針的一種,它的復(fù)制行為提供了所有權(quán)轉(zhuǎn)移的語(yǔ)義,即智能指針在復(fù)制時(shí)將對(duì)內(nèi)部維護(hù)的實(shí)際指針的所有權(quán)進(jìn)行了轉(zhuǎn)移,例如:
- template < typename T >
- class shared_ptr
- {
- private:
- class implement // 實(shí)現(xiàn)類,引用計(jì)數(shù)
- {
- public:
- implement(T* pp):p(pp),refs(1){}
- ~implement(){delete p;}
- T* p; // 實(shí)際指針
- size_t refs; // 引用計(jì)數(shù)
- };
- implement* _impl;
- public:
- explicit shared_ptr(T* p)
- : _impl(new implement(p)){}
- ~shared_ptr()
- {
- decrease(); // 計(jì)數(shù)遞減
- }
- shared_ptr(const shared_ptr& rhs)
- : _impl(rhs._impl)
- {
- increase(); // 計(jì)數(shù)遞增
- }
某些時(shí)候,需要共享同一個(gè)對(duì)象,此時(shí)auto_ptr就不敷使用,由于某些歷史的原因,Visual C++的標(biāo)準(zhǔn)庫(kù)中并沒(méi)有提供其他形式的智能指針,走投無(wú)路了嗎?在main()函數(shù)中,先調(diào)用foo1(val),函數(shù)中使用了一個(gè)局部對(duì)象temp,它和val共享同一份數(shù)據(jù),并修改了實(shí)際值。
函數(shù)返回后,val擁有的值同樣也發(fā)生了變化,而實(shí)際上val本身并沒(méi)有修改過(guò)。然后調(diào)用了foo2(val),函數(shù)中使用了一個(gè)無(wú)名的臨時(shí)對(duì)象創(chuàng)建了一個(gè)新值,使用賦值表達(dá)式修改了val,同時(shí)val和臨時(shí)對(duì)象擁有同一個(gè)值,函數(shù)返回時(shí),val仍然擁有這正確的值。