指针或数组
Pointer or array?
我知道指针在某种程度上很像数组(如果不是一个的话),但是我在判断何时应该显式删除指针时遇到了麻烦。
以以下代码为例:
#include <vector>
int main(int argc, char** argv)
{
std::vector<char*> strings;
strings.push_back(argv[0]);
return 0;
}
很明显,没有一个头脑正常的人会写出这样的程序,但是纯粹为了讨论,假设这是我的程序。我是否应该删除strings.at(0)
以避免那里的内存泄漏,或者在程序终止时将数据视为要销毁的字符数组?
vector
,并且我已经将它们都声明为该类的new
实例。然后我需要删除吗,还是可以?我是一个自学成才的程序员,所以这些复杂的(有时是危险的)概念让我变得偏执。
作为规则,您应该free
或delete
的malloc
或new
。
对于vector
,当你压入一个向量时,它会进行复制。因此,指针的复制只是复制指针所指向的地址,而不是实际指向的数据。
回答你的问题,你不应该释放argv[0]
,因为你没有malloc它-参见操作系统在哪里存储命令行参数?
如果你new
你自己的类,那么你应该删除向量中的条目,然后清除它(根据Claudiordgz的答案)。
EDIT由于答案已被删除,您可以执行如下操作:
for(auto it = strings.begin(); it != strings.end(); ++it)
{
delete *it;
}
strings.clear()
(直接复制参考答案)
在stack
上分配的局部变量->在函数退出时自动销毁。
动态分配的变量->在heap
上分配->在使用后需要delete
。
如果你有一个不间断运行的程序,比如某个守护进程/后台进程。您使用new
分配了许多动态变量,并且您在代码中经常这样做。然后,随着时间的推移,运行程序的内存需求将增加,因为您不删除它们,到一个点,您不再能够分配更多的内存。
如果是一个退出的小程序,操作系统通常会回收内存,但程序员的工作是不要让操作系统回收内存。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”