說起智慧型指標,不少人都不陌生。比方auto_ptr、shared_ptr、unique_ptr、weak_ptr。
依據shared_ptr的功能,自己仿造也實現了個。
對於shared_ptr這樣的智慧型指標,有乙個共享的引用計數器來控制指標物件的銷毀,當引用計數器變為0時。則銷毀指標指向的物件。對於多執行緒安全問題,我在**中使用的interlocked系列的原子操作函式。
在學習過程中,漸漸學會了raii(resource acquisition is initialization),慢慢領略到了這樣的模式的優點。
直接上**:
smartptr.hpp
#pragma once
#include "stdafx.h"
#include #include //#define debug_smartptr
templateclass smartptr;
template class refptr
refptr(const refptr&)
refptr& operator= (const refptr & ref)
~refptr()
}unsigned int addrefcount()
unsigned int subrefcount()
bool addrefcount_lock()
if (interlockedcompareexchange((unsigned int *)&nuse, temp + 1, temp) == temp)
} } volatile unsigned int nuse;
t *pointer;
};templateclass smartptr
explicit smartptr(const smartptr& sp) :ptr(sp.ptr)
explicit smartptr(const smartptr* sp) :ptr(sp->ptr)
smartptr& operator=(const smartptr& sp)
ptr = sp.ptr;
}}#ifdef debug_smartptr
std::cout << "copy2 smartpointer!" << std::endl;
#endif
return *this;
} t* operator->()
t* operator->() const
t& operator*()
t& operator*() const
bool operator!()
~smartptr()
#ifdef debug_smartptr
std::cout << "delete smartpointer!" << std::endl;
#endif
} int getrefcount() const
bool isnull()
t* getptr() const
//返回物件
t getvalue() const
private:
refptr*ptr;
};//相容const比較
templateinline bool operator==(const smartptr& a,const smartptr& b)
templateinline bool operator!=(const smartptr& a,const smartptr& b)
test.cpp
#include "smartptr.hpp"
#include #include #define threadcount 10
typedef struct _person_
}person;
smartptrg_p(new person);
unsigned int __stdcall testthread(void *pparam)
int _tmain(int argc, _tchar* ar**)
); smartptrp1(new person);
smartptrp2(p1);
const smartptrp3(p1);
smartptrp4(p3);
std::cout << (p3 == p1) << std::endl;
std::cout << (p2 == p0) << std::endl;
std::cout << (p3 != p1) << std::endl;
std::cout << (p2 != p0) << std::endl;
p4 = p0;
smartptr*p = new smartptr(p1);
for (int i = 0; i < threadcount; i++)
waitformultipleobjects(threadcount, hthread, true, infinite);
delete p;
} while (0);
system("pause");
return 0;
}
此處的do while(0)僅僅是我想在pause前列印出全部析構函式的輸出。
對於基於引用計數器的智慧型指標,最致命缺點就是迴圈引用,導致物件被長期占用,無法釋放。
以上是我對智慧型指標的實現和個人看法,如有不對的地方,歡迎指出。
c 智慧型指標 C 智慧型指標是如何實現的
c 程式執行時,計算機記憶體從大類上分為棧和堆,在棧上的記憶體是由系統自動分配和 的,而堆上的記憶體卻是由程式設計師手動申請和釋放的,如果程式設計師在記憶體的管理上出現失誤,輕則程式執行結果與預期有差距,重則程式直接崩潰 棧和堆記憶體 區別 棧記憶體上的變數在過了作用域 大括號 後系統會自動 而堆記...
C 智慧型指標實現
1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...
智慧型指標實現C
include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...