加個前提:本文對應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==============================