指针或数组

Pointer or array?

本文关键字:数组 指针      更新时间:2023-10-16

我知道指针在某种程度上很像数组(如果不是一个的话),但是我在判断何时应该显式删除指针时遇到了麻烦。

以以下代码为例:

#include <vector>
int main(int argc, char** argv)
{
    std::vector<char*> strings;
    strings.push_back(argv[0]);
    return 0;
}

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

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

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

作为规则,您应该freedeletemallocnew

对于vector,当你压入一个向量时,它会进行复制。因此,指针的复制只是复制指针所指向的地址,而不是实际指向的数据。

回答你的问题,你不应该释放argv[0],因为你没有malloc它-参见操作系统在哪里存储命令行参数?

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

EDIT由于答案已被删除,您可以执行如下操作:

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

(直接复制参考答案)

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

如果你有一个不间断运行的程序,比如某个守护进程/后台进程。您使用new分配了许多动态变量,并且您在代码中经常这样做。然后,随着时间的推移,运行程序的内存需求将增加,因为您不删除它们,到一个点,您不再能够分配更多的内存。

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