* 將new出的物件, 直接賦值給智慧型指標構造. 智慧型指標析構時, 呼叫構造時給定的類物件.
* 在智慧型指標中, 模擬指標的常用操作. 過載運算子 -> & * +
//#include "stdafx.h"
#include "mystring.h"
#include "smartptr.h"
void fntestsmartptr();
int main(int argc, char* argv)
void fntestsmartptr()
un_tmp;
un_tmp addr;
/// 模擬指標操作 ->
ptr->fntest();
/// 模擬指標操作 *
(*ptr).fntest();
/// 模擬指標操作 &
ppmystring = &ptr;
(*ppmystring)->fntest();
(*(&ptr))->fntest();
/// 列印智慧型指標中儲存的物件指標之值
addr.pclass = *(&ptr);
// std::setiosflags (std::ios::showbase | std::ios::uppercase)
cout << "ptr = 0x"
<< std::hex << setiosflags(ios::uppercase) << setfill('0') << setw(8)
<< addr.naddr << endl;
/// 模擬指標操作 +
addr.pclass = ptr + 1; ///< 只是計算位址, 不會報錯^_^
cout << "ptr + 1 = 0x"
<< std::hex << setiosflags(ios::uppercase) << setfill('0') << setw(8)
<< addr.naddr << endl;
}
// ismartptrelement.h: inte***ce for the ismartptrelement class.
////
#if !defined(afx_ismartptrelement_h__55dfbe74_2052_48e8_9cd6_9fd1567e61c3__included_)
#define afx_ismartptrelement_h__55dfbe74_2052_48e8_9cd6_9fd1567e61c3__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
#include "common.h"
/// 抽象類, csmartptr中操作的元素型別
class ismartptrelement
;#endif // !defined(afx_ismartptrelement_h__55dfbe74_2052_48e8_9cd6_9fd1567e61c3__included_)
// mystring.h: inte***ce for the cmystring class.
////
#if !defined(afx_mystring_h__3946972c_1380_4373_91e6_0c3bfdfeeed6__included_)
#define afx_mystring_h__3946972c_1380_4373_91e6_0c3bfdfeeed6__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
#include "common.h"
#include "ismartptrelement.h"
class cmystring : public ismartptrelement
};#endif // !defined(afx_mystring_h__3946972c_1380_4373_91e6_0c3bfdfeeed6__included_)
// smartptr.h: inte***ce for the csmartptr class.
////
#if !defined(afx_smartptr_h__99ae9ded_c11e_47ed_927e_e7a058b8e9fc__included_)
#define afx_smartptr_h__99ae9ded_c11e_47ed_927e_e7a058b8e9fc__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
#include "common.h"
#include "ismartptrelement.h"
#include "mystring.h"
#define csmartptr_type cmystring
class csmartptr
inline csmartptr_type operator *()
inline csmartptr_type** operator &()
inline csmartptr_type* operator +(size_t noffset)
private:
ismartptrelement* m_pptr;
};#endif // !defined(afx_smartptr_h__99ae9ded_c11e_47ed_927e_e7a058b8e9fc__included_)
/// @file common.h
/// @brief 公用標頭檔案
#ifndef common_h_1460ab26_69ba_45e7_8e75_3867bf8da316
#define common_h_1460ab26_69ba_45e7_8e75_3867bf8da316
#include #include #include #include #include #include #include #include #include #include using namespace std;
#ifndef bool
#define bool int
#define true 1
#define false 0
#endif // #ifndef bool
#ifndef null
#define null 0
#endif // #ifndef null
#ifndef safe_delete
#define safe_delete(x) \ \}
#endif // #ifndef safe_delete
#ifndef safe_delete_ary
#define safe_delete_ary(x) \ \}
#endif // #ifndef safe_delete_ary
#endif // #ifndef common_h_1460ab26_69ba_45e7_8e75_3867bf8da316
// ismartptrelement.cpp: implementation of the ismartptrelement class.
////
#include "stdafx.h"
#include "ismartptrelement.h"
//// construction/destruction
//ismartptrelement::ismartptrelement()
ismartptrelement::~ismartptrelement()
// mystring.cpp: implementation of the cmystring class.
////
#include "stdafx.h"
#include "mystring.h"
//// construction/destruction
//cmystring::cmystring()
cmystring::~cmystring()
// smartptr.cpp: implementation of the csmartptr class.
////
#include "stdafx.h"
#include "smartptr.h"
//// construction/destruction
//csmartptr::csmartptr(class ismartptrelement * pelement)
:m_pptr(pelement)
csmartptr::~csmartptr()
模擬實現智慧型指標
智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
模擬實現智慧型指標SharedPtr
首先我們先來乙個小小的區分三個智慧型指標 1,autoptr 管理權的轉移 嚴重缺陷,盡量不要使用 2,scopedptr 簡單粗暴 防拷貝 只宣告不定義 3,sharedptr 共享,引用計數,功能強大,迴圈引用,但是較為複雜 下面我們來模擬實現一下sharedptr template t cla...