我知道指针在某种程度上与数组(如果不是同一个)很相似,但是当我明确删除指针时,我无法解密。
以此代码为例:
#include <vector>
int main(int argc, char** argv)
{
std::vector<char*> strings;
strings.push_back(argv[0]);
return 0;
}
现在很明显,没有一个心智正常的人会制作一个完全相同的程序,但是对于纯粹的讨论,让我们说这是我的程序。我应该删除strings.at(0)
以避免内存泄漏,还是数据被认为是程序终止时要销毁的字符数组?
同样地,假设我有一个vector
我创建的类,并且我已将它们全部声明为类的new
个实例。我是否需要删除,或者它没问题?
我是一名自学成才的程序员,所以这些复杂的(有时是危险的)概念让我变得偏执。
答案 0 :(得分:3)
作为一项规则,您应该free
或delete
malloc
或new
。
使用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
分配了许多动态变量,并且在代码中经常这样做。然后,随着时间的推移,正在运行的程序的内存需求将会增加,因为您没有删除它们,以至于您无法再分配更多内存。
如果,它是一个退出的小程序,操作系统通常会回收内存,但程序员的工作就是不要让它留给操作系统来回收内存。