理解c++的new操作符
Understanding 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]);
以上是否有效?
我的理解是最后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
应该用于原始内存。
相关文章:
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- boost::make_shared没有调用(放置)操作符new
- c++中不使用new操作符的内存泄漏
- c++中new操作符与java中new操作符的区别
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 操作符new在异常后销毁初始化的对象
- 操作符new已在带有库的自定义内存管理器中定义
- 关于操作符new()和操作符delete()的问题
- 操作符new(n)与new unsigned char[n]的位置new
- 如何使用操作符new的unique_ptr
- 操作符new将内存初始化为零
- 如何重载操作符new和delete来跟踪内存
- 在类中使用重载操作符new
- 操作符new在c++中的语法对我来说是新的
- 重写操作符new函数的调用堆栈不完整
- 重载操作符new / allocate大于对象大小
- 将原始操作符new、放置new和标准删除合并是否合法
- 重载操作符new