星期四, 3月 20, 2008

Small Block Heap of Crap

原文


今天休息時看eMule的原始碼看到了Small Block Heap這個東西,偶然發現這篇文章,指控MSVC的一個bug。雖然說目前市面上沒有Compiler可以百分之百符合C++ standard,但這個bug也太驚人了。

在MS VC6.0,假如你在一個module用new從heap抓記憶體,然後在另外一個module(如dll)去delete他,這個程式是有可能產生memory leak或Segmentation fault的。理由:在某些特殊的情況下(詳原文),M$VC不同的module會使用不同的heap,所以一樣的pointer在不同的module可能實際指向不同的記憶體,ㄎㄎㄎ

據說這個bug因為沒有documentation,花了原文作者好幾個月去找,偉哉!M$

---
2008/06/30 Update
看來是我和作者都腦殘了。

在同一個process裡的所有module都一定共用同一個Address space,所以不可能會有同一個pointer在DLL和在main裡指向不同physical address的情形。但是雖然他們都用同一個Address Space但卻可以用不一樣的heap,在A heap new出來的東西一定要在A heap進行delete,因為只有A heap會記載你這個new的相關資訊,對其他heap來說,把A heap new出來的東西丟給其他heap去delete,就等於憑空拿個大家都不認識的指標要其他heap去delete,當然memory management的code當然會出錯。

從哪本書知道的呢?Programming Applications for Microsoft Windows一定要唸一下的啊。 全文連結

0 意見: