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也可以指向其他地方。比较两种声明数组的方法
除了上面提到的,声明(和初始化数组)的两种方式之间还有其他区别吗?
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也可以指向其他地方。比较两种声明数组的方法
除了上面提到的,声明(和初始化数组)的两种方式之间还有其他区别吗?
buf1
是一个自动对象(或静态,如果它在全局范围内); *buf2
是一个动态对象。也就是说,buf1
的使用期限是自动控制的,而*buf2
的使用期限是您自己管理的。 (buf2
直到您说出类似delete[] buf2;
的内容)。
初始化程序也不同; buf1
被大括号初始化,而*buf2
被默认初始化(即,其int
元素未被初始化)。
+1:事实上'buf1'是自动的,而'buf2'是动态的,这是迄今为止最重要的区别。 –
如果声明int buf1 [] = {0,0,0,0,0};在函数退出后,数组将被销毁。在第二种情况下,在完成像使用delete [] buf2一样的使用后,您必须手动删除数组,但这种方式不会自动销毁,因此您可以在任何地方使用它,直到删除它为止。
除了你必须清理(删除)你的第二个版本?而第一个和第二个版本将分配在RAM的不同区域?如果这些0被存储而不是生成,第一个可能会占用更多的可执行空间?或者第二个版本甚至会将RAM清除为0,我不相信它。
他们是非常不同的。
在第一种情况:
在第二种情况:
delete []
之后)int buf1[] = {0,0,0,0,0};
这给出自动存储,如果它是在一个块中,或静态存储,如果它在一个命名空间。在第一种情况下,它会一直持续到程序离开它在内部声明的程序块;第二,它持续到程序退出。
int* buf2 = new int[5];
这将动态创建数组;您可以控制其使用期限,并持续到删除它(delete [] buf2
)。如果你不删除它,那么就有内存泄漏,这是你应该避免的。为了确保动态对象被正确删除,最好不要直接用原始指针来管理它们,而应该使用智能指针或容器等类来为你管理它。
严格地说,是否存在内存泄漏取决于您对':: operator new()的实现(例如,它可以从池中进行分配,以便正确清理)。你总是有一个“终身泄漏”。 –
你为什么假设每个元素都在'new'情况下初始化? –
@FredLarson我只是省略了初始化步骤,以节省一些空间。 –
虽然它专门用于C,但这可能有一些用处:http://c-faq.com/aryptr/index.html – Polynomial