C++中記憶體塊置0的三種方法:memset, ZeroMemory和SecurZeroMemory

來源:互聯網
上載者:User

加個前提:本文對應Windows下編程環境。


簡而言之:一般情況,如初始化記憶體塊的時候,用ZeroMemory。銷毀記憶體塊中儲敏感性資料時或者釋放存有敏感性資料(比如密碼,密鑰等)的記憶體塊前應使用使用SecurZeroMemory。如無特殊原因不使用“={ 0 }”。

使用memset函數將記憶體塊置0是完全沒有問題。memset的好處是跨平台比較容易,可是C/C++跨平台就是夢魘。在使用memset的時候有個小地方需要注意,W.Richard Stevens在《UNIX網路編程》中提到void *memset(void *dest, int c, size_t count)的後兩個參數容易寫反,而且在編譯時間無法發現。


ZeroMemory宏,在底層就是由memset實現的。只是ZeroMemory易讀性更好,更加健壯。或者說看起來更cool、更professional。在微軟平台下的程式,推薦使用ZeroMemory。


SecurZeroMemory函數,可以看作是在安全方面加強版的ZeroMemory。細心的讀者是否注意到ZeroMemory是宏,而SecurZeroMemory是函數?ZeroMemory在一定的編譯最佳化條件下,使用ZeroMemory置0以後的記憶體塊如果再也不被引用,ZeroMemory有可能會被“最佳化”掉而不執行。如果這塊記憶體裡儲存的是使用者的密碼、加解密演算法的密鑰等敏感資訊,就存在被駭客偷窺的可能。而SecurZeroMemory在任何條件下都不會被“最佳化”掉,所以在銷毀記憶體塊中儲敏感性資料時或者釋放存有敏感性資料的記憶體塊前應使用SecurZeroMemory,而不是ZeroMemory。


至於"={ 0 }"的形式,盡量不要使用,不夠直觀。而且在記憶體對齊方面也存在一定問題。有興趣的朋友可以參考Raymond Chen的《Why do Microsoft code samples tend to use ZeroMemory instead of { 0 }?》

順便提一句,Raymond Chen可不是一般的人物,他是Windows組元老級人物,著有The old new thing一書,對Windows的技術曆史和原理感興趣的朋友可以一讀。他的Blog: http://blogs.msdn.com/b/oldnewthing/ 到現在依然非常活躍。


==============================The End==============================

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.