我正在覆盖{em>堆内存管理器的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)
}
答案 0 :(得分:2)
新的将在堆栈中并且不需要自己的互斥锁是否正确?
运算符new[]()
的工作方式与new()
类似,但它不是分配单个对象,而是分配一个对象数组。我不知道与堆栈有什么关系,分配的对象在堆上分配,并返回指向该内存的指针。
堆栈上唯一的东西就是指针本身,但new
的两个版本就是这种情况。
看到new[]()
调用new()
然后我没有看到原因为什么您需要new[]()
中的互斥锁,因为new()
已经受到互斥锁的保护。任何调用new[]()
的线程都必须等待另一个已经在new()
内的线程。