这两个陈述有什么区别?
stringstream *myStream = new stringstream(s);
和
stringstream myStream(s);
我听说首先返回一个指针并“动态”分配内存。但我并不真正理解其中的差异。
提前谢谢
答案 0 :(得分:5)
如果你在一个函数内,在这种情况下:
stringstream myStream(s);
myStream在堆栈上分配。它将在范围结束时自动销毁。它也非常有效。
在这种情况下:
stringstream *myStream = new stringstream(s);
myStream是指向堆上分配的对象的指针。当你拨打delete myStream
时,它会被销毁。
大多数时候你想使用堆栈。它是高效的,内存可以自动释放给你。它也恰好少于打字。
有时您需要更多控制权。您希望函数创建一个对象并使其存在,直到您明确删除它为止。这些情况应该很少见,使用现代C ++,您应该使用unique_ptr或shared_ptr之类的东西来简化内存管理。
答案 1 :(得分:1)
我听说首先返回一个指针并“动态”分配内存。但我并不真正理解其中的差异。
这是对的。程序可以使用几种类型的内存:
静态/全局内存,在编译时分配,在程序的整个生命周期内使用与该变量相同的地址
堆栈内存,它是函数/作用域的本地内容,以便在作用域输入时创建变量,并在作用域退出时自动销毁。在编译时计算相对于堆栈指针的地址,因此它非常高效和快速,例如:
if(int x = f()) std :: cout<< X; // x在“if”范围内的范围内,但在此行之后它被销毁
自由存储(堆)内存,它是动态分配的,这意味着可以在运行时计算可以创建变量的内存地址,并且取决于已经进行的其他动态内存请求。这是相对较慢的,并且手动,因为您必须具有匹配的delete
来销毁对象并释放内存。
答案 2 :(得分:0)
当您使用new
获取指向新对象的指针(第一种情况)时,您必须稍后显式delete
此指针。如果不这样做,就会有内存泄漏。
在第二种情况下,您不必担心这一点 - 通过调用析构函数离开当前作用域后,对象将自动处理掉。
答案 3 :(得分:0)
在第一种情况下:stringstream *myStream = new stringstream(s);
您的对象存储在具有一些有限内存的堆栈上,如果以这种方式分配非常大的对象(其成员也在堆栈上分配并且具有一些疯狂大小的对象),则可能会出现堆栈溢出。您可能会感觉到这种约束,尤其是在资源有限的嵌入式系统中。
此外,一旦程序超出范围,就会调用堆栈上分配的对象的析构函数,这使得它们在许多情况下都不实用。因此,通常首选使用关键字new
将对象存储在堆上,并将对象存储在堆内存中,其大小大致限于可用RAM。但是,在这种情况下,您需要在正确的位置删除对象,否则可能会导致内存泄漏。