[英]Difference between int someInts[3] and int* someInts = new int[3]?
通过使用int someInts[3]
声明新的整数数组与使用int* someInts = new int[3]
声明之间有什么区别?
有两个主要区别:
第一个将在堆栈上分配一个内存,一旦函数返回,该内存将不可用。
第二个将在freestore上分配一个内存,该内存在删除之前将一直可用。
第一个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.