|
|
1
27
首选局部变量,除非需要对象的生存期扩展到当前块之外。(局部变量是第二个选项)。这比担心内存管理简单多了。
|
|
|
2
22
在堆栈上声明变量与在堆中声明变量时,有两个主要注意事项—生存期控制和资源管理。 当您严格控制对象的生命周期时,在堆栈上进行分配非常有效。这意味着您不会将该对象的指针或引用传递给本地函数范围之外的代码。这意味着,没有输出参数,没有COM调用,没有新线程。有很多限制,但是在从当前作用域正常或异常退出时,您可以正确地清理对象(不过,您可能需要使用虚拟析构函数读取堆栈展开规则)。堆栈分配的最大缺点是:堆栈通常被限制为4K或8K,因此您可能需要小心放置在堆栈上的内容。 另一方面,在堆上进行分配需要手动清理实例。这也意味着您可以自由地控制实例的生命周期。您需要在两种情况下执行此操作:a)将该对象传递到范围之外;或者b)对象太大,在堆栈上分配它可能会导致堆栈溢出。 顺便说一句,这两者之间的一个很好的折衷办法是在堆上分配对象,并在堆栈上分配指向它的智能指针。这确保了您不会浪费宝贵的堆栈内存,同时仍能在范围退出时进行自动清理。 |
|
|
3
13
第二种形式是所谓的RAII(资源获取是初始化)模式。与第一种方法相比,它有许多优点。
使用时
如果使用第二种形式,当变量超出范围时,它总是自动清除。如果抛出异常,堆栈将展开,并将其清理。
|
|
|
4
6
除了到目前为止所说的,还需要考虑其他性能因素,特别是在内存分配密集型应用程序中:
|
|
|
5
3
|
|
|
6
2
两者之间最大的区别在于,新对象启动指向该对象的指针。 通过创建对象而不创建新对象,启动的对象存储在堆栈上。如果它是用new启动的,它将返回一个指针,指向在堆上创建的新对象。它实际上返回一个指向新对象的内存地址。发生这种情况时,需要对变量进行内存管理。使用完该变量后,需要对其调用delete以避免内存泄漏。如果没有新的运算符,当变量超出范围时,内存将自动释放。
|
|
|
7
0
Mark Ransom是正确的,您还需要使用
|