2012-02-21 107 views

回答

6

有2间主要的差异:

  1. 第一个将分配堆栈上的存储器,那将是一次函数返回不可用。
    第二个将在freestore上分配一个内存,这个内存将一直存在,直到被删除。

  2. 第一个someInts是一个整数的数组,你不能指定新的地址给它。
    第二个是int指针,所以你可以给它分配一个新的地址。

+2

根据您的角度来看,它可能没有帮助“栈”和“堆”来区分,因为这些都不是概念C++语言本身涉及的。 – 2012-02-21 01:16:59

+0

@OliCharlesworth - 感谢您的评论。你会用什么词来指出我提到的第一个区别? – MByD 2012-02-21 01:19:53

+0

@OliCharlesworth相反,RAII习惯用法是C++设计的一大问题。并且说,freestore不是RII中的R是不灵活的。 – 2012-02-21 01:20:34

0

声明int* someInts = new int[3]在堆上分配内存。声明int someInts[3]将它分配到堆栈上。

3

这种差异通常很重要(尤其是当您处理的不是int s时),当您使用后者(int *someints = new int[3];)时,必须在完成使用后明确删除数据。

大多数情况下,您想用std::vector<int> someints(3);代替。为数据,这将(通常)分配的空间同样,当变量超出范围(包括,例如,它会自动删除空间,留下通过一个异常范围被抛出,这是更为困难在手动分配/释放内存时正确处理)。

+0

+1:第一个答案,管理解释的差异没有提到实现特定的细节(堆栈与堆)。 – 2012-02-21 01:17:40

0

当你someInts [3],你在栈上分配内存,这意味着它会删除自己(好),但如果你要访问的功能已经结束,你会遇到麻烦之后,因为它已经将已被删除。 IE:

int* returnPointerThingy(){ 
    int someInts[3]; 
    someInts[0] = 3; 
    someInts[1] = 2; 
    someInts[2] = 1; 
    return someInts 
} 

这将返回一个空指针,因为someInts已被删除。如果你尝试访问someInts上帝帮助你。

如果这与您想要使用new关键字的操作类似。它将允许你在“堆”上分配一些东西,并且它会在它声明的函数结束后继续存在。因此:

int* returnPointerThingy(){ 
    int* someInts = new int[3]; 
    someInts[0] = 3; 
    someInts[1] = 2; 
    someInts[2] = 1; 
    return someInts 
} 

不会返回空指针,您将能够使用someInts存储的值。然而,这带有一个缺点,你必须删除someInts这样的:

delete [] someInts 

所以你不要有内存泄漏最终,当堆被采取了由指针和这样的。

这要看您的具体情况为,其使用的都是在自己的情况更好。

相关问题