理解c++的new操作符

Understanding c++ new operator

本文关键字:操作符 new c++ 理解      更新时间:2023-10-16

假设ITEM是一个类

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

以上是否有效?

我的理解是最后2个使用了new操作符不分配内存。它们只是调用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

我在这里使用它(用于练习)

我的理解是,new操作符的最后两次使用不分配内存。它们只是调用ITEM的构造函数。

是的。这是"放置new"操作符,它不分配内存并调用对象构造函数。这样做是合法的,尽管ITEM构造函数将被调用两次(这意味着ITEM类构造函数将被执行两次:一次是在调用标准new时,一次是在调用放置new时)。如果在ITEM的构造函数中分配了一些资源,这可能导致内存泄漏(或其他意外行为)。

上面的等价于?

不,这不是等价的。在后一种情况下,在每个循环中创建一个临时对象,并将其复制到item[i]。这将在每个循环中调用ITEM构造函数、赋值操作符和析构函数。在前一种情况下,位置new只调用ITEM构造函数,不调用其他函数。

"placement new"的典型用法是当您希望将对象分配到特定的内存区域(而不是标准new操作符分配内存的堆)时。这可能是共享内存之类的……"Placement new"是少数可以/必须显式调用对象析构函数的情况之一,即:item[i]->~ITEM()

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

上面可能是无效的。new操作符已经构造了数组中的每个对象。这是双重结构(对于不太重要的类型可能会导致错误)。

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

这只是为数组中的每个条目分配一个默认构造对象。这和赋值操作符一样安全。

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