【发布时间】:2012-02-21 01:10:32
【问题描述】:
使用int someInts[3] 与使用int* someInts = new int[3] 声明一个新的整数数组有什么区别?
【问题讨论】:
标签: c++ arrays pointers declaration
使用int someInts[3] 与使用int* someInts = new int[3] 声明一个新的整数数组有什么区别?
【问题讨论】:
标签: c++ arrays pointers declaration
有两个主要区别:
第一个将在堆栈上分配内存,一旦函数返回,该内存将不可用。
第二个将在 freestore 上分配一个内存,在删除之前一直可用。
第一个someInts 是一个整数数组,不能为其分配新地址。
第二个是指向 int 的指针,所以你可以给它分配一个新的地址。
【讨论】:
通常很重要的区别(特别是当您处理ints 以外的其他内容时)是,当您使用后者 (int *someints = new int[3];) 时,您必须在完成使用后显式删除数据它。
大多数时候,您想改用std::vector<int> someints(3);。这将(通常)类似地为数据分配空间,但是它会在变量超出范围时自动删除该空间(包括,例如,通过抛出异常离开范围,当您手动分配/释放内存时,更难以正确处理)。
【讨论】:
声明int* someInts = new int[3] 会在堆上分配内存。声明 int someInts[3] 会将其分配到堆栈上。
【讨论】:
当你执行 someInts[3] 时,你会在堆栈上分配内存,这意味着它会自行删除(很好),但如果你想在函数结束后访问,你会遇到麻烦,因为它已经有被删除。即:
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 存储的值。然而这有一个缺点,你必须像这样删除一些Ints:
delete [] someInts
因此,当堆被指针等占用时,您不会导致内存泄漏。
这取决于您的情况,因为两者都适合自己的情况。
【讨论】: