繁体   English   中英

int someInts [3]和int * someInts = new int [3]之间的区别?

[英]Difference between int someInts[3] and int* someInts = new int[3]?

通过使用int someInts[3]声明新的整数数组与使用int* someInts = new int[3]声明之间有什么区别?

有两个主要区别:

  1. 第一个将在堆栈上分配一个内存,一旦函数返回,该内存将不可用。
    第二个将在freestore上分配一个内存,该内存在删除之前将一直可用。

  2. 第一个someInts是一个整数数组,您不能为其分配新地址。
    第二个是指向int的指针,因此您可以为其分配一个新地址。

通常重要的区别是(特别是当您处理int以外的其他东西时)是使用后者( int *someints = new int[3]; )时,您必须显式删除数据完成使用它。

大多数时候,您想使用std::vector<int> someints(3); 代替。 这将(通常)类似地为数据分配空间, 但是当变量超出范围时,它将自动删除该空间(例如,包括通过引发异常而离开范围,这更难处理)手动分配/释放内存时正确显示)。

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

当您执行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

因此,当堆被指针等占用时,您不会以内存泄漏而告终。

这取决于您使用的情况,因为两者在各自的情况下都更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM