[C/C++]_[中級]_[使用智能指標的方式釋放malloc出來的堆空間]

來源:互聯網
上載者:User

標籤: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出來的堆空間]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.