Вы не должны делать ручное управление памятью следующим образом. Используйте вектор:
#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);
}
}
}
}
Update
Поскольку вы не обеспечивают обратную связь (почему 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
Пожалуйста, объясните причину, прежде чем вниз голосование вопрос, я новичок здесь, поэтому, пожалуйста, будьте внимательны и помогите мне улучшить. – Harry
. Вот и все, так ошибочный код, ему нужна большая статья, чтобы рассказать. –
Пожалуйста, используйте отладчик, прежде чем спрашивать здесь, или жалуйтесь на пустые голоса. –