美文网首页
placement new在堆内存中创建对象数组

placement new在堆内存中创建对象数组

作者: DyadicQ | 来源:发表于2019-02-22 11:12 被阅读0次

如果类(class)中我们指定了带参数的构造函数(constructor),那么一般在创建该对象类型的数组时是没法给定构造参数的,就是说无法调用到我们指定的构造函数,如下:

class Foo {
    public:
        Foo(int ID);
        int getId();
    private:
        int ID;
};

Foo::Foo(int ID) {
    this->ID = ID;
}

int Foo::getId() {
    return ID;
}
int main () {

Foo *foos = new Foo[10];  //错误,没有正确调用到构造函数

//...
 }  

我们可以在定义数组时直接初始化,这样可以给定构造参数,例如:

int ID1, ID2, ID3, .... , ID10;
Foo *foos = {
  new Foo(ID1),
  new Foo(ID2),
  ...
  new Foo(ID10)
};

这样可以,但是如果我们想要在堆中动态分配数组那怎么办呢?这里就要用到operator new[]函数(注意,这是函数,不是操作符),它的用法:operator new[] (size_t m)

如下:

void *raw = operator new[] (10 * sizeof(Foo));
Foo *foos  = static_cast<Foo*> (raw);
for (int i = 0; i < 10; i++) {
  new (&foos[i]) Foo (ID);    //注意这种用法,可以直接将数组中对应元素对象调用构造函数构造。
}

还有一种思路就是构建指针数组,然后调用构造函数构造:

void *raw = operator new[] (10 * sizeof(Foo*));
Foo **pfoos = static_cast<Foo**> (raw);
for (int i = 0; i < 10; i++) {
  pfoos[i] = new Foo(ID);
}

对比这两种方式,很有意思,尤其前一种方式的用法(这种方式叫做placement new)。
注意这种方式要手动释放内存,需要两步,第一步:

//与构造顺序相反
for (int i = 9; i >= 0; --i) {
  foos[i].~Foo();   
}

第二步:

//释放raw指针
operator delete[] raw;

相关文章

  • placement new在堆内存中创建对象数组

    如果类(class)中我们指定了带参数的构造函数(constructor),那么一般在创建该对象类型的数组时是没法...

  • 浅谈JVM

    堆、栈、方法区概念区别 1, Java 堆 堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java...

  • java编程中的堆与栈,你了解多少?

    在JVM中内存有这5类 堆(Heap) 存放关键字new创建的对象和数组; java堆是jvm内存管理中最大的一块...

  • 创建一个对象用什么运算符?对象实体与对象引用有何不同?

    new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引...

  • 【golang】性能优化

    1.内存管理 在栈中创建对象比在堆中创建对象性能高,少用new来创建对象,多用object{}创建,如果需要创建大...

  • 对象

    对象数据类型数组Array、对象object、正则Regexp 、new Date()对象数据类型存储在堆内存中开...

  • 第七天

    数组 数组是引用数据类型中的对象数据类型(特殊对象)创建一个数组,也要开辟一个堆内存,堆内存中存储数据对象中的键值...

  • 1.17 初识数组

    数组是引用数据类型中的对象数据类型(特殊对象)创建一个数组,开辟一个堆内存,堆内存中存储数组对象中的键值对let ...

  • JVM系列(二):深入讲解JVM内存溢出分析!

    JVM 内存溢出 1、堆内存溢出 堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots...

  • 堆和栈

    基本要点 基本数据类型、局部变量都是存放在栈内存中的,用完就消失了。new创建的实例化对象及数组,是放在堆内存中的...

网友评论

      本文标题:placement new在堆内存中创建对象数组

      本文链接:https://www.haomeiwen.com/subject/hsmsyqtx.html