理解c ++ new运算符

时间:2016-10-25 07:05:45

标签: c++ new-operator

假设ITEM是一个类

ITEM* items = new ITEM[10];
for(i=0;i<10;++i)
    new(&items[i)ITEM();
new(&items[0])ITEM(items[1]);

以上是否有效?

我理解的方式是新运算符的最后两次使用 不分配内存。他们只是调用ITEM的构造函数。

以上是否相当于?

ITEM* items = new ITEM[10];
for(i=0;i<10;++i)
    items[i] = ITEM();
item[0] = ITEM(items[1]);

编辑:

https://github.com/gosom/practice-cpp/blob/master/arrays/darray.h

我在这里使用它(练习)

2 个答案:

答案 0 :(得分:1)

for(i=0;i<10;++i)
    new(&items[i)ITEM();

以上内容可能无效。 new运算符已经构造了数组中的每个对象。这是双重构造(可能并且可能会导致错误,而不是普通类型)。

for(i=0;i<10;++i)
    items[i] = ITEM();

这只是为数组中的每个条目指定一个默认的构造对象。这和赋值运算符一样安全。

一般情况下,展示位置new应该用于原始内存。

答案 1 :(得分:1)

  

我理解的方式是新运算符的最后两次使用不分配内存。他们只是调用ITEM的构造函数。

是。这是&#34;贴装新品&#34;运算符,它不分配内存并调用对象构造函数。这样做是合法的,尽管ITEM构造函数将被调用两次(意味着ITEM类构造函数将被执行两次:一次调用标准new时,一次展示位置new。如果在ITEM的构造函数中分配了一些资源,这可能会导致内存泄漏(或其他意外行为)。有关展示位置信息的更多信息,请参阅this

  

以上是否相当于?

不,这不等同。在后一种情况下,您在每个循环中创建一个临时对象,并将其复制到item[i]。这将在每个循环中调用ITEM构造函数,赋值运算符和析构函数。在之前的情况中,放置新的只调用ITEM构造函数,没有别的。

&#34;放置新&#34;的典型用法是什么时候你希望你的对象被分配在一个特定的内存区域(而不是堆,标准new运算符分配内存)。这可能是共享内存等等......&#34;安置新内容&#34;对象析构函数可以/必须被明确地称为少数几种情况之一,即:item[i]->~ITEM()