【问题标题】:Pointer or array?指针还是数组?
【发布时间】:2014-03-22 02:24:25
【问题描述】:

我知道指针在某种程度上很像数组(如果不是相同的话),但我无法理解何时应该显式删除指针。

以这段代码为例:

#include <vector>

int main(int argc, char** argv)
{
    std::vector<char*> strings;

    strings.push_back(argv[0]);
    return 0;
}

现在很明显,没有一个头脑正常的人会制作一个完全像这样的程序,但为了纯粹的讨论,假设这是我的程序。我应该删除strings.at(0) 以避免那里的内存泄漏,还是在程序终止时将数据视为要销毁的字符数组?

同样,假设我有一个我创建的类的vector,并且我已将它们全部声明为该类的new 实例。然后我需要删除,还是可以?

我是一名自学成才的程序员,所以这些复杂(有时是危险的)概念让我变得偏执。

【问题讨论】:

  • 你被严重误导了;指针和数组根本不是一回事。阅读comp.lang.c FAQ 的第 6 节;它也适用于 C++。
  • 作为一个对内存管理感兴趣的自学成才的程序员,我相信你应该看看(如果你还没有看过)智能指针在 C++11 中是如何工作的

标签: c++ arrays pointers memory-management


【解决方案1】:

作为一项规则,你应该freedelete 任何你mallocnew 的东西。

使用vector,当您推入向量时,它会进行复制。所以指针的副本只是复制指针指向的地址,而不是实际指向的数据。

要回答您的问题,您不应该释放 argv[0],因为您没有对其进行 malloc - 请参阅 Where does the OS store the command line arguments? 以获得解释。

如果您 new 您自己的班级,那么您应该删除向量中的条目,然后将其清除(根据 Claudiordgz 的回答)。

编辑因为答案已被删除,您可以执行以下操作:

for(auto it = strings.begin(); it != strings.end(); ++it)
{
  delete *it;
}
strings.clear()

(直接复制参考答案)

【讨论】:

    【解决方案2】:

    局部变量 -> 分配在stack -> 函数退出时自动销毁。
    动态分配的变量->分配在heap上->使用后需要delete他们。

    如果您有一个不间断运行的程序,请说一些守护程序/后台进程。而且您使用new 分配了很多动态变量,并且您在代码中经常这样做。然后,随着时间的推移,您正在运行的程序的内存需求将会增加,因为您没有删除它们,以至于您无法再分配更多的内存。

    如果退出的是一个小程序,操作系统通常会回收内存,但程序员的工作是不要让操作系统来回收内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2011-02-18
      • 2017-04-14
      • 1970-01-01
      • 2013-08-02
      相关资源
      最近更新 更多