このコードは、GCC -O2 コンパイラの最適化では正しく実行されませんでした。O2 最適化は、Foo オブジェクトのメモリ リークを引き起こすだけです。これは、-O3 を使用しても、最適化を行わなくても問題なく動作します。なぜこれが -O2 で動作しないのか説明してください。gcc バージョン 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) で導入された問題。コンパイラは 64 ビットで、アプリケーションも 64 ビットであることに注意してください。
#include<stdlib.h>
class Foo
{
public:
Foo()
{
p_UserData = NULL;
}
void* p_UserData;
};
void Destroy(Foo* pFoo)
{
long* pL = (long*)&pFoo->p_UserData;
if(--(*pL) <= 0)
delete pFoo;
}
int main()
{
int i = 0;
while( i < 10)
{
Foo* pFoo = new Foo();
long* pL = (long*)&pFoo->p_UserData;
*pL = 1;
Destroy(pFoo);
i++;
}
return 0;
}