4

我正在为我们的堆内存管理器new()覆盖和操作符。有一个互斥体并且是线程安全的,但我没有将互斥体添加到,它用作传递运算符,因为我怀疑它在调用时会在堆栈上。将在堆栈上并且不需要自己的互斥锁是否正确?new[]()new()new[]()new[]()

/*!
\brief Override the Standard C++ new [] operator
\param size [in] Number of bytes to allocate
\exception std::bad_alloc
\returns Pointer to the start of the allcoated memory block of \c size bytes
\todo Check if this is thread-safe or if it needs a mutex lock, return address probably is on the stack so it should be ok
*/
void *operator new[] (size_t size)
{
    return operator new(size);
}

/*!
\brief Overrides the Standard C++ new operator
\param size [in] Number of bytes to allocate
\exception std::bad_alloc
\returns Pointer to the start of the allcoated memory block of \c size bytes
*/
void *operator new(size_t size) 
{
    MM_ENTER_CRITICAL_SECTION(CMemoryManager::mutex)
    // Memory manager code removed since it's outside of the question context
    MM_LEAVE_CRITICAL_SECTION(CMemoryManager::mutex)
}
4

1 回答 1

2

new 将在堆栈上并且不需要自己的互斥锁是否正确?

运算符的new[]()工作方式与分配单个对象类似new(),但它分配一个对象数组。我不知道这与堆栈有什么关系,分配的对象是在堆上分配的,并且指向该内存的指针会返回给您。

堆栈上唯一的东西是指针本身,但对于new.

看到那个new[]()调用new()然后我看不出你需要一个互斥锁的原因,new[]()因为new()它已经受到互斥锁的保护。new[]()如果另一个线程已经在里面,任何调用的线程都必须等待new()

于 2013-03-11T11:03:36.037 回答