消除警告"构建本地静态对象不是线程安全的"

时间:2015-01-26 15:34:52

标签: c++

我有以下课程:

struct globalAllocated 
{
    void operator delete(void*p)
    {
        static HANDLE heap= GetHeap();
        ::HeapFree(heap, 0, p);
    }
}

警告C4640:'堆' :构造本地静态对象不是线程安全的

我考虑过使用与互斥锁的某些同步,但这看起来很昂贵。

使堆成为私有成员不会起作用,因为操作符删除覆盖必须是静态的,因此堆必须是私有的 - 但如果我将其声明为静态类成员,则无法在何处初始化它。

什么是最好的解决方案?

1 个答案:

答案 0 :(得分:3)

如果你可以使用C ++ 11,那么它必须是线程安全的。 (但是,如果您关注性能问题,也可以通过使用互斥锁轻松实现。)

更一般地说:尝试确保在启动多个线程之前调用该函数。 (在许多应用程序中,只需要在静态对象的初始化中将其调用到某处。)