【问题标题】:Compare two ways of declaring an array比较两种声明数组的方式
【发布时间】:2011-11-30 16:12:32
【问题描述】:
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 也可以指向其他地方。

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

【问题讨论】:

  • 你为什么假设每个元素都在new的情况下被初始化?
  • @FredLarson 我只是省略了初始化步骤以节省一些空间。
  • 虽然它是专门为 C 设计的,但这可能会有一些用处:c-faq.com/aryptr/index.html
  • @Polynomial 非常有帮助。解决了我的困惑!
  • 请注意,截至 2003 年版本的 c++。如果你想让你的第二个例子初始化为 0,你可以写:int* buf2 = new int[5]();

标签: c++ arrays pointers reference


【解决方案1】:

buf1 是一个自动对象(如果它在全局范围内,则为静态对象); *buf2 是一个动态对象。也就是说,buf1 的生命周期是自动控制的,而 *buf2 的生命周期是你来管理的。 (buf2 一直存在,直到你说出类似 delete[] buf2; 这样的话。)

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

【讨论】:

  • +1:buf1 是自动的,而 buf2 是动态的这一事实是迄今为止最重要的区别。
【解决方案2】:

第一种情况:

  • 使用自动(在函数范围内)或静态(在命名空间范围内)分配
  • 您已将值初始化为全零

第二种情况:

  • 使用动态分配(稍后您必须delete []
  • 数组未初始化

【讨论】:

    【解决方案3】:
    int buf1[] = {0,0,0,0,0};
    

    如果它在块中,则提供 自动 存储,如果在命名空间中,则提供 静态 存储。在第一种情况下,它会一直持续到程序离开它在里面声明的块;第二种,一直持续到程序退出。

    int* buf2 = new int[5];
    

    这会动态创建数组;你可以控制它的生命周期,它会一直持续到你删除它 (delete [] buf2)。如果您不删除它,则存在内存泄漏,这是您应该避免的。为确保动态对象被正确删除,最好不要直接使用原始指针管理它们,而应使用RAII 类(例如智能指针或容器)来为您管理。

    【讨论】:

    • 严格来说,是否存在内存泄漏取决于您对::operator new() 的实现(例如,它可以从您正确清理的池中分配)。你总是有一个“终身泄漏”。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      它们非常不同。

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 2013-06-21
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        相关资源
        最近更新 更多