【问题标题】:What does ::new mean?::new 是什么意思?
【发布时间】:2012-12-18 07:04:16
【问题描述】:

在检查 MS directX 11 DXUT 示例时,出现以下代码:

template<typename TYPE> HRESULT CGrowableArray <TYPE>::SetSize( int nNewMaxSize )
{
int nOldSize = m_nSize;

if( nOldSize > nNewMaxSize )
{
    assert( m_pData );
    if( m_pData )
    {
        // Removing elements. Call dtor.

        for( int i = nNewMaxSize; i < nOldSize; ++i )
            m_pData[i].~TYPE();
    }
}

// Adjust buffer.  Note that there's no need to check for error
// since if it happens, nOldSize == nNewMaxSize will be true.)
HRESULT hr = SetSizeInternal( nNewMaxSize );

if( nOldSize < nNewMaxSize )
{
    assert( m_pData );
    if( m_pData )
    {
        // Adding elements. Call ctor.

        for( int i = nOldSize; i < nNewMaxSize; ++i )
            ::new ( &m_pData[i] ) TYPE;
    }
}

return hr;
}

这可以在我的 DXSDK 版本(2010 年 6 月)的第 428 行的 DXUTmisc.h 中找到。我想知道 ::new 的事情....我正在尝试谷歌并搜索堆栈溢出但似乎搜索引擎在我输入“::new”时丢弃了两个冒号在搜索栏中....

【问题讨论】:

标签: c++ new-operator scope-resolution


【解决方案1】:

::new 调用意味着程序正在尝试使用全局 new 运算符来分配空间,而不是使用在类或命名空间范围内定义的任何 new 运算符。特别是,这段代码试图使用名为 placement new 的东西,其中正在创建的对象被放置在内存中的特定位置。通过显式回调到全局作用域中,该函数确保 this 正确使用新位置,并且不会意外调用作用域链中某处引入的不同分配函数。

希望这会有所帮助!

【讨论】:

  • +1 用于指出 XY 问题。 (他们问过 X,但确实需要知道 Y)
  • +1 用于指出新的展示位置。我应该注意到这一点。
  • 谢谢,我认为这主要是新展示位置的问题。实际的内存分配是在 SetSizeInternal() 行上通过 realloc 调用完成的。所以这里的new其实只是调用TYPE的构造函数,如果有的话。
  • 那么 TYPE 是什么意思? (即::new (&amp;x) int)int 是做什么的?
  • @David- 这里,TYPE 是一个模板参数,指示正在存储的对象类型。 ::new (&amp;x) int 行的意思是“在指针&amp;x 所指的内存位置构造一个int 类型的对象。
【解决方案2】:

::new 确保调用全局的 new 运算符,即标准的 new 运算符。注意 :: new 之前的表示全局范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2011-07-12
    • 2015-03-21
    • 1970-01-01
    • 2021-11-05
    • 2013-08-18
    相关资源
    最近更新 更多