我一直在努力解决内存泄漏问题,我正在编写一个程序来读取某种图像颜色。
问题:我无法找到内存泄漏/泄漏的来源。
我尝试了什么:我通过Valgrind运行程序。在许多不可处理的信息中,下面是我可以做出的错误:
2
[其中有3个] Invalid write of size 4
Conditional jump or move depends on uninitialised value(s)
看看上面的错误,我认为这个问题与不正确的初始化有关。但我无法看到哪里。
答案 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)