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 に答える