Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存泄漏问题c++;程序_C++_Memory Leaks - Fatal编程技术网

C++ 内存泄漏问题c++;程序

C++ 内存泄漏问题c++;程序,c++,memory-leaks,C++,Memory Leaks,我一直在与内存泄漏作斗争,我正在编写一个程序来读取特定的图像颜色 代码: 问题:我无法找到内存泄漏的来源 我尝试的内容:我通过Valgrind运行了该程序。在大量无法处理的信息中,我可以找出以下错误: 大小为4的写入无效[其中有3个] 条件跳转或移动取决于未初始化的值 Syscall param write(buf)指向未初始化的字节 看看上面的错误,我认为问题与不正确的初始化有关。但是我看不到在哪里。你不应该这样做手动内存管理。使用向量: #include <iostream>

我一直在与内存泄漏作斗争,我正在编写一个程序来读取特定的图像颜色

代码:

问题:我无法找到内存泄漏的来源

我尝试的内容:我通过Valgrind运行了该程序。在大量无法处理的信息中,我可以找出以下错误:

  • 大小为4的写入无效
    [其中有3个]
  • 条件跳转或移动取决于未初始化的值
  • 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[]
ing
image
之后(在内部
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)
{