我有以下课程:
struct globalAllocated
{
void operator delete(void*p)
{
static HANDLE heap= GetHeap();
::HeapFree(heap, 0, p);
}
}
警告C4640:'堆' :构造本地静态对象不是线程安全的
我考虑过使用与互斥锁的某些同步,但这看起来很昂贵。
使堆成为私有成员不会起作用,因为操作符删除覆盖必须是静态的,因此堆必须是私有的 - 但如果我将其声明为静态类成员,则无法在何处初始化它。
什么是最好的解决方案?
答案 0 :(得分:3)
如果你可以使用C ++ 11,那么它必须是线程安全的。 (但是,如果您关注性能问题,也可以通过使用互斥锁轻松实现。)
更一般地说:尝试确保在启动多个线程之前调用该函数。 (在许多应用程序中,只需要在静态对象的初始化中将其调用到某处。)