2

这两种说法有什么区别?

stringstream *myStream = new stringstream(s);

stringstream myStream(s);  

我听说首先返回一个指针并“动态”分配内存。但我并不真正理解其中的区别。

先感谢您

4

4 回答 4

5

如果您在函数内部,在这种情况下:

stringstream myStream(s);  

myStream 在堆栈上分配。它将在作用域结束时自动销毁。它也非常有效。

在这种情况下:

stringstream *myStream = new stringstream(s);

myStream 是指向在堆上分配的对象的指针。当你调用它时它会被销毁delete myStream

大多数时候你想使用堆栈。它很高效,内存会自动为您释放。它也恰好是更少的类型。

有时你需要更多的控制。您希望一个函数创建一个对象并使其存在,直到您明确删除它。这些情况应该很少见,对于现代 C++,您应该使用 unique_ptr 或 shared_ptr 之类的东西来简化内存管理。

于 2013-04-18T05:09:42.247 回答
1

我听说首先返回一个指针并“动态”分配内存。但我并不真正理解其中的区别。

这是正确的。您的程序可以使用几种类型的内存:

  • 静态/全局内存,在编译时分配,在程序的整个生命周期中使用用于该变量的相同地址

  • 堆栈内存,它是函数/作用域的本地变量,因此变量在进入作用域时创建,并在作用域退出时自动销毁。相对于栈指针的地址是在编译时计算出来的,所以非常高效快速,例如:

    if (int x = f()) std::cout << x; // x 在 "if" 范围内,但在这一行之后它被销毁了

  • 自由存储(堆)内存,它是动态分配的,这意味着可以创建变量的内存地址是在运行时计算的,并且取决于已经进行了哪些其他动态内存请求。这是相对较慢的,并且是手动的,因为您必须有一个匹配delete来销毁对象并释放内存。

于 2013-04-18T05:11:31.423 回答
0

在第一种情况下:stringstream *myStream = new stringstream(s);

您的对象存储在内存有限的堆栈上,如果您以这种方式分配非常大的对象(其成员也分配在堆栈上并且具有一些疯狂的大小的对象),您可能会出现堆栈溢出。您可能会感觉到这种限制,尤其是在资源有限的嵌入式系统中。

此外,一旦程序超出范围,堆栈上分配的对象的析构函数就会被调用,这使得它们在许多情况下不实用。因此,通常首选使用关键字将new对象存储在堆上,并且对象存储在堆内存中,其大小大致受限于您的可用 RAM。但是,在这种情况下,您需要在正确的位置删除对象,否则可能会导致内存泄漏。

于 2013-04-18T05:15:04.267 回答
0

当您用于new获取指向新对象的指针时(第一种情况),您必须delete在一段时间后显式地使用此指针。如果你不这样做,你将有内存泄漏。

在第二种情况下,您无需担心这一点 - 对象将在离开当前范围后通过调用其析构函数自动处置。

于 2013-04-18T05:10:03.447 回答