为什么我会在堆中禁止分配?

ere*_*eOn 5 c++ heap stack memory-management class

我最近读了很多关于"防止一个类的堆分配"(参见这个问题).

我能够理解"如何",但现在我无法弄清楚"为什么"有人愿意这样做.

我想这一定有合理的理由,但我无法弄明白.

简而言之:"为什么我要禁止用户在堆中创建我的类的对象?"

Nem*_*vic 13

只有在堆栈上实例化对象时,某些类才有意义.例如,Boost scoped_ptrlock_guard.

  • 特别是考虑到简单地重新定义`new`并不会阻止对象嵌入到超类中,而超类本身就是堆可分配的... (2认同)

Pau*_*ams 5

主要是因为堆栈分配的对象在超出范围时会自动清理,从而消除了大量的错误 - 即内存分配错误.

  • 为了节省大约一百个CPU指令,引入一个语义噩梦听起来像是一个过早优化的情况. (3认同)
  • @Visage:堆分配的开销远远超过一百个CPU指令 - 如果过度使用,则间接到堆的成本可能很大,此外,管理内存使用额外的周期和内存.基本的事实是,从性能角度来看,堆栈分配更好,而且在语义上也更清晰. (3认同)
  • @Visage:也许你甚至可以提供一个例子,其中堆栈和堆都可以使用,堆分配比堆栈分配更清晰......我认为没有一个例子.现在,考虑:`void foo(){for(int*i = new int(0);*i <10 <++*i){...}}`--ouch,如何释放指针?使用智能指针 - 在*堆栈* - :`void foo(){for(auto_ptr <int> i(new int(0));*i <10; ++*i){...} `...我们仍然*使用堆栈,代码更复杂,或者不是? (2认同)
  • @Visage:问题是堆栈分配总是比代码中的堆分配简单.我提供了第一个例子:循环的控制变量不可能用纯堆分配来编写.现在球在你的理由中:你能提供证据证明堆分配比堆栈分配更清晰吗?(将示例限制为可以实际使用堆栈分配的情况).堆栈**是默认值,堆是在堆栈不适合问题时. (2认同)