2011-11-30 93 views
1
int buf1[] = {0,0,0,0,0}; 

int* buf2 = new int[5]; //assume every element is initialzed to 0 as well 

我能想到的唯一区别是buf1是对数组的引用,而buf2是指向数组的指针。换句话说,buf1总是指向数组,而buf2也可以指向其他地方。比较两种声明数组的方法

除了上面提到的,声明(和初始化数组)的两种方式之间还有其他区别吗?

+5

你为什么假设每个元素都在'new'情况下初始化? –

+0

@FredLarson我只是省略了初始化步骤,以节省一些空间。 –

+1

虽然它专门用于C,但这可能有一些用处:http://c-faq.com/aryptr/index.html – Polynomial

回答

9

buf1是一个自动对象(或静态,如果它在全局范围内); *buf2是一个动态对象。也就是说,buf1的使用期限是自动控制的,而*buf2的使用期限是您自己管理的。 (buf2直到您说出类似delete[] buf2;的内容)。

初始化程序也不同; buf1被大括号初始化,而*buf2被默认初始化(即,其int元素未被初始化)。

+2

+1:事实上'buf1'是自动的,而'buf2'是动态的,这是迄今为止最重要的区别。 –

1

如果声明int buf1 [] = {0,0,0,0,0};在函数退出后,数组将被销毁。在第二种情况下,在完成像使用delete [] buf2一样的使用后,您必须手动删除数组,但这种方式不会自动销毁,因此您可以在任何地方使用它,直到删除它为止。

1

除了你必须清理(删除)你的第二个版本?而第一个和第二个版本将分配在RAM的不同区域?如果这些0被存储而不是生成,第一个可能会占用更多的可执行空间?或者第二个版本甚至会将RAM清除为0,我不相信它。

他们是非常不同的。

3

在第一种情况:

  • 自动(在功能范围内)或静态的(在命名空间范围)分配用于
  • 已初始化的值,以全零

在第二种情况:

  • 动态分配被使用(并且您将必须在delete []之后)
  • 该阵列未初始化
2
int buf1[] = {0,0,0,0,0}; 

这给出自动存储,如果它是在一个块中,或静态存储,如果它在一个命名空间。在第一种情况下,它会一直持续到程序离开它在内部声明的程序块;第二,它持续到程序退出。

int* buf2 = new int[5]; 

这将动态创建数组;您可以控制其使用期限,并持续到删除它(delete [] buf2)。如果你不删除它,那么就有内存泄漏,这是你应该避免的。为了确保动态对象被正确删除,最好不要直接用原始指针来管理它们,而应该使用智能指针或容器等类来为你管理它。

+0

严格地说,是否存在内存泄漏取决于您对':: operator new()的实现(例如,它可以从池中进行分配,以便正确清理)。你总是有一个“终身泄漏”。 –