使用" new"创建对象之间的区别或不。

时间:2013-04-18 05:05:27

标签: c++ object

这两个陈述有什么区别?

stringstream *myStream = new stringstream(s);

stringstream myStream(s);  

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

提前谢谢

4 个答案:

答案 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。但是,在这种情况下,您需要在正确的位置删除对象,否则可能会导致内存泄漏。