这段代码没有通过 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;
}