【问题标题】:about using the C++ 'new' syntax [duplicate]关于使用 C++ 'new' 语法 [重复]
【发布时间】:2014-10-28 03:11:07
【问题描述】:

我正在分析矢量类。 然后,我可以找到这个语法

(第一个新语法)

void construct(pointer __p, const _Ty& _Val)
    {new ((void *)__p) _Ty(_Val)};

template<typename _Up, typename ... _Args>
    void construct(_Up* __p, _Args&&... __args)
    {new ((void *)__p) _Ty(_STD forward<_Args>(__args)...)};

我可以理解这不等于

     __p = new _Ty(_Val);

那么这两个语句有什么区别,我应该如何解释第一个新语法? (在 VisualStudio2013 中)

【问题讨论】:

标签: c++ stl


【解决方案1】:

这两种说法有什么区别

代码构造:

new (<address>) <typename>{ <arguments> };

称为“新位置”。与默认的new (即相同但没有地址)相反,此调用根本不分配内存,而是假定&lt;address&gt; 是已分配的内存(足够大),并简单地在提供的位置构造对象地址。

这不是new 运算符的唯一特殊情况。您还可以将分配器或其他一些(随机)上下文信息传递给 new。

为了让 new 支持这一点(将其他信息传递给操作员),您必须定义一个自定义的 operator new 实现,它将额外信息作为参数接收。要详细了解如何执行此操作,请在线查看(搜索“custom operator new”、“placement new”和“define custom operator new”)。 请注意,实现自定义 new 运算符有一些正确实现的缺陷。这就是为什么如果你打算定义它,你应该阅读更多。

标准库默认实现 new、placement new 和(我认为)支持 std::allocator 实例的 new。

【讨论】:

  • &lt;address&gt; 周围缺少括号
【解决方案2】:
  __p = new _Ty(_Val);

表示分配一个内存块(通过 malloc),在该空间中构造一个 _Ty 对象(使用 _Val)。将 allocate & 构造块的地址存储在 __p 中。

 new ((void *)__p) _Ty(_Val)

表示内存已经分配在地址__p,在该空间构造一个_Ty对象(使用_Val)

【讨论】:

  • 在第一个例子中,内存不是通过malloc分配的,而是通过operator new()函数分配的。
【解决方案3】:

它被称为新的展示位置。它不像常规的 new 表达式那样为对象分配内存,而是在指针指向的内存中构造它。

向量这样做是为了将内存分配与对象构造分开;调用reserve 可以为许多元素分配足够的内存,但在向量增长到该内存之前将其留空。

如果你像这样创建一个对象,那么它必须通过显式调用其析构函数来销毁:

__p->~_Ty();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2016-01-01
    • 2015-12-04
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多