指针或数组?

时间:2014-03-22 02:24:26

标签: c++ arrays pointers memory-management

我知道指针在某种程度上与数组(如果不是同一个)很相似,但是当我明确删除指针时,我无法解密。

以此代码为例:

#include <vector>

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

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

现在很明显,没有一个心智正常的人会制作一个完全相同的程序,但是对于纯粹的讨论,让我们说这是我的程序。我应该删除strings.at(0)以避免内存泄漏,还是数据被认为是程序终止时要销毁的字符数组?

同样地,假设我有一个vector我创建的类,并且我已将它们全部声明为类的new个实例。我是否需要删除,或者它没问题?

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

2 个答案:

答案 0 :(得分:3)

作为一项规则,您应该freedelete mallocnew

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

要回答您的问题,您不应该免费argv[0],因为您没有使用它 - 请参阅Where does the OS store the command line arguments?以获取解释。

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

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

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

(从参考答案中直接复制)

答案 1 :(得分:1)

局部变量 - &gt;分配在stack - &gt;功能退出时会自动销毁 动态分配的变量 - &gt;分配在heap - &gt;使用后需要delete

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

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