我总是使用这种方法声明我的数组:
bool array[256];
但是,我最近被告知使用以下方式声明我的数组:
bool* array = new bool[256];
有什么区别,哪个更好?老实说,我并不完全理解第二种方式,所以对此的解释也会有所帮助。
答案 0 :(得分:3)
bool array[256];
这会分配一个带有自动storage duration的bool数组。
超出范围时会自动清理。 在大多数实现中,如果它未声明为静态或全局,则将在堆栈上分配。
与替代方案相比,堆栈上的分配/解除分配在计算上非常便宜。它也可能对数据局部性有一些优势,但这不是你通常要担心的事情。但是您可能需要注意分配许多大型数组以避免堆栈溢出。
bool* array = new bool[256];
这会分配一个具有动态存储持续时间的数组。
您需要稍后致电delete[]
来自行清理。如果不这样,那么你会泄漏记忆
或者(如@Fibbles所述),您可以使用smart-pointers来表达所需的所有权/生命周期要求。这将使清理智能指针类的责任。即使在异常的情况下,这对于保证删除也有很大帮助。
它的优点是能够将其传递到外部作用域和其他对象而无需复制(在某些情况下,RVO也会避免复制第一种情况,但将其存储为数据成员并且其他用途不能在第一种情况下进行了优化)。
答案 1 :(得分:2)
首先是在堆栈上分配内存:
// inside main (or function, or non-static member of class) -> stack
int main() {
bool array[256];
}
或者可能是静态记忆:
// outside main (and any function, or static member of class) -> static
bool array[256];
int main() {
}
最后一个是动态内存的分配(在堆中):
int main() {
bool* array = new bool[256];
delete[] array; // you should not forget to release memory allocated in heap
}
动态内存的优点是可以使用可变数量的元素创建(不是256,而是来自某些用户输入)。但你应该每次都自己发布它。
有关堆栈,静态和堆内存以及何时应该使用它们的更多信息,请访问:Stack, Static, and Heap in C++
答案 2 :(得分:0)
差异是静态与动态分配,正如先前的答案所示。使用其中一个是有原因的。 Herb Sutter的这段视频解释了你何时应该使用什么。 https://www.youtube.com/watch?v=JfmTagWcqoE这只是超过1个半小时。
我的偏好是使用
bool array[256];
除非有理由不这样做。
麦克