内存泄漏问题c ++程序

时间:2015-10-17 19:51:27

标签: c++ memory-leaks

我一直在努力解决内存泄漏问题,我正在编写一个程序来读取某种图像颜色。

代码:http://ideone.com/dcU5Su

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

我尝试了什么:我通过Valgrind运行程序。在许多不可处理的信息中,下面是我可以做出的错误:

  • 2 [其中有3个]
  • Invalid write of size 4
  • Conditional jump or move depends on uninitialised value(s)

看看上面的错误,我认为这个问题与不正确的初始化有关。但我无法看到哪里。

2 个答案:

答案 0 :(得分:1)

您不应该像这样进行手动内存管理。使用矢量:

#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);
            }
        }
    }
}

<强>更新

由于您没有提供反馈(为什么delete[]似乎在您的示例中的循环内),我能做的最好的是发布重构的建议,包括我将做的修复/改进:

<强> Live On Coliru

#include <iostream>
#include <sstream>

#include <cstring>
#include <cassert>

struct Image {
    unsigned int l;
    unsigned int b; 
    unsigned int h;  
};

class Images {
  private:
    size_t capacity;
    size_t size;

    Image *images;

    Images& operator=(Images const&); // not supported
    Images(Images const&);            // not supported

    void autogrow() {
        if (size >= capacity) {
            int newCapacity = capacity * 2;
            Image* newImage = new Image[newCapacity];
            std::cout << "growing " << capacity << " -> " << newCapacity << "\n";

            //only available in c++11:
            static_assert(std::is_pod<Image>::value, "you're screwed");
            memcpy(newImage, images, size * sizeof(Image));

            capacity = newCapacity;
            delete[] images;
            images = newImage;

        }
    }

  public:
    Images() : capacity(1), size(0), images(new Image[capacity]) { 
        assert(images);
    };
    ~Images() {
        delete[] images;
    }

    Image& insert(Image const& img) {
        autogrow();
        assert(size<capacity);
        return images[size++] = img;
    }

};

int main()
{
    using namespace std;

    Images collection;

    std::string line;
    while(getline(cin,line))
    {
        if(true) {
            istringstream iss(line);

            Image cur;
            while (iss >> cur.l >> cur.b >> cur.h) {
                collection.insert(cur);
            }
        }
    }
}

打印,例如

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

答案 1 :(得分:0)

我想当通过外部 while循环的第二次迭代时执行while (iss >> image[j].l >> image[j].b >> image[j].h)时,image指针无效,因为您在上一次迭代中删除了它

因此,在delete[]第二次image之后(在内部while循环之后),您应该重置变量(就像您重新委托外部{{} 1}}第一次循环。

while

或者,你应该把这个&#34;重置&#34;阻止外部// reset delete[] (image); capacity = 1; size = 0; j = 0; image = new Image[capacity]; 的开头(并在它之前摆脱初始化)。

我不知道整个程序的逻辑,但我认为这是理想的行为...

编辑:所以可以通过将while移到size++;之上来解决问题(感谢@sehe找到内存违规的来源:))

if (size >= capacity)