標籤:auto_ptr wrap object c 自動釋放
情境:
1. 使用auto_ptr 的方式可以wrap類對象, 之後在方法結束後可以自動釋放對象, 參考;這樣在有條件判斷的語句時可以省掉free語句或CloseHandle.
http://blog.csdn.net/infoworld/article/details/9008911
2.C++的特性之一就是類對象(非傳回值的對象)在方法結束後會自動調用解構函式,這樣在解構函式裡可以放一些釋放資源的操作.
3. 這裡實現了一個類似auto_ptr的類的實用Wrap類,可以參考根據自己需要自訂特定的Wrap類.auto_ptr的壞處之一就是只支援new出來的對象,
之二是不能刪除數組. delete []
4. 恰當使用WrapObject能有效減少記憶體流失,因為在很多C編程裡, 太多的if語句在return前需要釋放對象,很容易就會出錯或多次釋放。
檔案 wrap_object.h
#ifndef __WRAP_OBJECT#define __WRAP_OBJECT#include <stdlib.h>#include <Windows.h>template<BOOL (WINAPI* WrapHandleFunc)(void*)>class WrapHandle{public:WrapHandle(void* data):data_(data){}~WrapHandle(){if(data_){WrapHandleFunc(data_);data_ = NULL;}}private:void* data_;};class WrapMalloc{public:WrapMalloc(void* data):data_(data){}~WrapMalloc(){ free(data_);data_ = NULL;}void Reset(){free(data_);data_ = NULL;}private:void* data_;};#endif
使用方式:
// Specify an HTTP server. const char* www = "www"; std::string URLADDR = DhOptionDomain::GetValue("url:brand"); const char* www_start = strstr(URLADDR.c_str(),www); if( !hSession ) { return kNetworkError; } WrapHandle<WinHttpCloseHandle> session_wh(hSession); wchar_t* www_start_unicode = ConvertUtf8ToUnicode(www_start); WrapMalloc www_wm(www_start_unicode); hConnect = WinHttpConnect( hSession, www_start_unicode, INTERNET_DEFAULT_HTTP_PORT, 0 ); // Create an HTTP request handle. if(!hConnect ) { return kNetworkError; } WrapHandle<WinHttpCloseHandle> connect_wh(hConnect); hRequest = WinHttpOpenRequest( hConnect, L"GET", L"/win-update.xml", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH ); // Send a request. if(!hRequest) { return kNetworkError; } WrapHandle<WinHttpCloseHandle> request_wh(hRequest); bResults = WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 ); // End the request. if(!bResults ) {return kNetworkError; } bResults = WinHttpReceiveResponse( hRequest, NULL );
注意: 如果沒有WrapObject的話你就得記得在if裡釋放不斷增加的 Handle對象,它是提高程式品質的好處之一,建議直接用到項目裡.
[C/C++]_[中級]_[使用智能指標的方式釋放malloc出來的堆空間]