数组中的内存分配拼图声明

时间:2013-05-24 11:59:54

标签: c++

在cpp中,我可以声明arry为:

char list[20];

它将从内存中分配20,我们可以使用sizeof确认它

我们也可以声明

char *list = new char[20];

那两个声明之间的区别是什么?

3 个答案:

答案 0 :(得分:1)

主要区别在于数组所在的内存:第一个位于堆栈上(或者在全局数据段中),第二个位于堆上。在堆上意味着你负责分配的内存(你必须在某处“删除”它。)

答案 1 :(得分:1)

1)char list[20];的空间将存在于堆栈中 2)char *list = new char[20];的空间将存在于堆中。然后可以使用'delete'运算符释放它。方法1不能。
当声明它的函数返回时,方法1的已分配空间将再次可用。

答案 2 :(得分:1)

两个选项之间的主要区别是数组的存储类。这有两个有趣的效果。

  1. 在内存中分配对象
  2. 已分配对象的生命周期
  3. 让我们看看这两个选项并进行比较。

    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_ptrunique_ptr

    使用动态存储的主要原因是,如果要分配某些内容(在您的用例中)对于自动存储来说太大,或者您需要该对象比声明它的上下文更长。缺点是动态内存分配比其他替代方案贵得多(花费大量时间)。