在cpp中,我可以声明arry为:
char list[20];
它将从内存中分配20,我们可以使用sizeof确认它
我们也可以声明
char *list = new char[20];
那两个声明之间的区别是什么?
答案 0 :(得分:1)
主要区别在于数组所在的内存:第一个位于堆栈上(或者在全局数据段中),第二个位于堆上。在堆上意味着你负责分配的内存(你必须在某处“删除”它。)
答案 1 :(得分:1)
1)char list[20];
的空间将存在于堆栈中
2)char *list = new char[20];
的空间将存在于堆中。然后可以使用'delete'运算符释放它。方法1不能。
当声明它的函数返回时,方法1的已分配空间将再次可用。
答案 2 :(得分:1)
两个选项之间的主要区别是数组的存储类。这有两个有趣的效果。
让我们看看这两个选项并进行比较。
char list[20];
使用此选项,list
的存储类取决于它的声明位置。在任何一种情况下,list
的生命周期都在声明它的范围的末尾结束。此时,内存将自动释放。在此之前,内存属于list
对象,并且对此内存的任何指针或引用都保持有效。您也可以将此声明放在类定义中,在这种情况下,list
的生命周期将与绑定的类实例的生命周期重合。
char *list = new char[20];
给定类型char*
,list
只是指向内存中字符的指针。如上所述(在初始化中使用new
),该字符将是在免费商店中分配的数组(类型char[20]
)中的第一个字符。同样,list
的生命周期与上述相同。当list
本身超出范围(或它的一部分实例被销毁)时,它将被销毁。但是,在这种情况下,list
只是指针的名称,并不引用数组本身。此阵列具有动态存储,并将保持分配,直到您手动声明应该释放它。这可以这样做:
delete[] list;
请注意[]
,这是必需的,因为list
被分配为数组(使用“array new”)。如果您没有delete[]
列表,则会泄漏内存,这很糟糕,因为这意味着系统可用的内存较少(以及其他进程),直到程序终止。为避免记住这一点,您通常应该依赖智能指针,例如shared_ptr
和unique_ptr
。
使用动态存储的主要原因是,如果要分配某些内容(在您的用例中)对于自动存储来说太大,或者您需要该对象比声明它的上下文更长。缺点是动态内存分配比其他替代方案贵得多(花费大量时间)。