C++ 内存泄漏问题c++;程序
我一直在与内存泄漏作斗争,我正在编写一个程序来读取特定的图像颜色 代码: 问题:我无法找到内存泄漏的来源 我尝试的内容:我通过Valgrind运行了该程序。在大量无法处理的信息中,我可以找出以下错误:C++ 内存泄漏问题c++;程序,c++,memory-leaks,C++,Memory Leaks,我一直在与内存泄漏作斗争,我正在编写一个程序来读取特定的图像颜色 代码: 问题:我无法找到内存泄漏的来源 我尝试的内容:我通过Valgrind运行了该程序。在大量无法处理的信息中,我可以找出以下错误: 大小为4的写入无效[其中有3个] 条件跳转或移动取决于未初始化的值 Syscall param write(buf)指向未初始化的字节 看看上面的错误,我认为问题与不正确的初始化有关。但是我看不到在哪里。你不应该这样做手动内存管理。使用向量: #include <iostream>
[其中有3个]大小为4的写入无效
条件跳转或移动取决于未初始化的值
Syscall param write(buf)指向未初始化的字节
看看上面的错误,我认为问题与不正确的初始化有关。但是我看不到在哪里。你不应该这样做手动内存管理。使用向量:
#include <iostream>
#include <sstream>
#include <vector>
struct Image {
unsigned int l;
unsigned int b;
unsigned int h;
};
int main()
{
using namespace std;
std::vector<Image> image;
std::string line;
while(getline(cin,line))
{
if(rand()%2)
{
istringstream iss(line);
Image img;
while (iss >> img.l >> img.b >> img.h)
{
image.push_back(img);
}
}
}
}
印刷品,例如
od /dev/urandom -Anone -t u4 -w36 | head -1000 | ./a.out
growing 1 -> 2
growing 2 -> 4
growing 4 -> 8
growing 8 -> 16
growing 16 -> 32
growing 32 -> 64
growing 64 -> 128
growing 128 -> 256
growing 256 -> 512
growing 512 -> 1024
growing 1024 -> 2048
growing 2048 -> 4096
我猜当通过外部while循环的第二次迭代执行while(iss>>image[j].l>>image[j].b>>image[j].h)
时,image
指针无效,因为您在上一次迭代中删除了它
因此,在第二次delete[]
ingimage
之后(在内部while
循环之后),您应该重置变量(就像您第一次在外部while
循环中重设中心一样)
// reset
delete[] (image);
capacity = 1;
size = 0;
j = 0;
image = new Image[capacity];
或者,您应该将这个“reset”块放在外部的开头,而(并且在它之前去掉初始化)
我不知道整个程序的逻辑,但我假设这是期望的行为
编辑:因此可以通过将size++;
移动到if(size>=capacity)
的正上方来解决问题(感谢@sehe找到内存冲突的根源:)
请在对问题进行否决表决之前解释原因,我是新来的,所以请考虑一下,帮助我改进这些有缺陷的代码,它需要一篇更大的文章来说明什么。请在提出问题之前使用调试器,或者抱怨否决票。@πάνταῥεῖ 代码的哪些部分有缺陷,有一些变量初始化我没有提到,但除此之外,你看到了什么问题?@πάνταῥεῖ 我已经使用了valgrind并展示了我的观察结果,直到查看您的代码以给出更具体的提示(您的SSCE已损坏)我不想使用向量,您能建议我当前的问题是什么吗implementation@Harry你为什么不想使用std::vector呢?@Harry我已经包含了重构代码(我同意\@865719,但你没有确认/解释delete[]
电话,所以我说不出来)。如果你想看的话,它是可用的。(@865719我认为这应该可以解决这个问题,谢谢洛蒂。我认为这个样本太破碎了,无法得出实际结论,但我在回答中把它重构成了一团乱麻:)
// reset
delete[] (image);
capacity = 1;
size = 0;
j = 0;
image = new Image[capacity];
size++;
if (size >= capacity)
{