我应该在什么时候分配堆? (C ++)

我不明白什么时候应该在堆上分配内存以及何时应该在堆栈上分配内存。 我真正知道的是,在堆栈上分配速度更快,但由于堆栈较小,我不应该使用它来分配大型数据结构; 在决定分配内存的位置时应考虑哪些其他事项? 编辑:我应该在哪里分配实例变量?


  • 在堆栈上分配大多数对象。 生命周期==范围。
  • 如果您需要手动控制对象的生命周期,请将其分配到堆上。
  • 如果对象很大并且堆栈不够大,请将其分配到堆上。
  • 在情况2和3中使用(严重名称)RAII习惯用法,它允许您在堆栈上使用对象来操纵可能是堆上对象的资源 - 一个很好的例子就是像std :: shared_ptr / boost这样的智能指针:: shared_ptr的。

  • 当内存必须超出当前函数的范围时才使用堆。


    只有在编译时知道需要的存储空间有多大时,才能将堆栈用作存储空间。 接下来你可以使用堆栈

  • 单个对象(如你声明一个本地intdoubleMyClass temp1;变量
  • 静态大小的数组(像你在声明char local_buf[100];MyDecimal numbers[10];
  • 当你只知道你在运行时需要多少空间时,你必须使用堆(“free store”),你应该使用这个堆来存放大的静态已知的缓冲区(比如不要char large_buf[32*1024*1024];

    然而,通常情况下,你很少直接触摸堆,但通常使用为你管理一些堆内存的对象(并且对象可能位于堆栈上或作为另一个对象的成员 - 然后你不关心另一个对象的位置生活)

    给一些示例代码:

    {
    char locBuf[100]; // 100 character buffer on the stack
    std::string s;    // the object s will live on the stack
    myReadLine(locBuf, 100); // copies 100 input bytes to the buffer on the stack
    s = myReadLine2();
      // at this point, s, the object, is living on the stack - however 
      // inside s there is a pointer to some heap allocated storage where it
      // saved the return data from myReadLine2().
    }
    // <- here locBuf and s go out-of-scope, which automatically "frees" all
    //  memory they used. In the case of locBuf it is a noop and in the case of
    //  s the dtor of s will be called which in turn will release (via delete)
    //  the internal buffer s used.
    

    因此,为了给一个简短的回答你的问题 :不要在堆上分配(通过任何new ,除非这是通过适当的包装对象完成)。 (std :: string,std :: vector等)

    链接地址: http://www.djcxy.com/p/82477.html

    上一篇: When should I allocate on the heap? (C++)

    下一篇: dot notation vs pointer