【发布时间】:2026-02-23 17:55:02
【问题描述】:
我在确定程序中导致内存泄漏的原因时遇到问题。下面是我正在运行的代码:
char *input[999];
//exec commands
for(unsigned int i = 0; i < commands.size(); i++)
{
string current = "";
string word = "";
int k = 0;
for(unsigned int j = 0; j < commands.at(i).size(); j++) //iterate through letters
{
current = commands.at(i);
//cout << "current: " << current << endl;
if(current[j] == ' ')
{
input[k] = new char[word.size() + 1];
strcpy(input[k], word.c_str());
k++;
word = "";
}
else
word += current[j]; //add letter
//cout << "word: " << word << endl;
}
input[k] = new char[word.size() + 1];
strcpy(input[k], word.c_str());
k++;
input[k] = NULL;
//...
//...
for(int z = 0; z <= k; z++)
{
delete[] input[z];
}
}
通过 valgrind 运行这段代码,我发现我的内存肯定丢失了。为了尝试重新创建场景并进行调试,我在此处提供了上述代码的较小规模版本:
int main()
{
char* var[999];
string s = "1234";
var[0] = new char[4 + 1];
strcpy(var[0], s.c_str());
delete [] var[0];
return 0;
}
根据 valgrind,此代码没有任何内存泄漏。我在原始代码中没有取消分配什么?我的测试代码在做什么而我的原始代码没有做什么?谢谢,感谢您的帮助。
【问题讨论】:
-
commands是一个包含单独 bash 命令(存储为字符串)的向量。它将持有ls && pwd,其中ls、&&和pwd是commands中的单独索引。 -
没有直接关系,但我猜你想在删除循环中表达
z < k而不是z <= k:) -
我不想在
k处一直迭代到最后吗?我在索引k做的最后一件事是input[k] = NULL。对它进行delete没有影响吗? -
请只使用一个向量,避免所有新的/删除的麻烦。这是一个非常类似于 C 的 C++ 代码解决方案。
-
您是否有可能在未显示的
//...代码中的某处意外重用或重置k?
标签: c++ arrays memory-leaks valgrind dynamic-memory-allocation