Почему у меня заканчивается куча памяти?

Поэтому я пишу raytracer на C ++, используя Jetbrains Clion IDE. Когда я пытаюсь создать изображение 600 * 600 с включенным сглаживанием мультисэмплинга, у меня заканчивается память. Я получаю эту ошибку:

прекращение вызова после выброса экземпляра ‘std :: bad_alloc’
что (): std :: bad_alloc

Это приложение запросило среду выполнения прекратить его в
Необычный способ. Пожалуйста, свяжитесь со службой поддержки приложения для получения более
Информация.

Код моей функции рендеринга:

ширина: 600
высота: 600
numberOfSamples: 80

void Camera::render(const int width, const int height){
int resolution = width * height;
double scale = tan(Algebra::deg2rad(fov * 0.5));  //deg to rad
ColorRGB *pixels = new ColorRGB[resolution];
long loopCounter = 0;
Vector3D camRayOrigin = getCameraPosition();
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
double zCamDir = (height/2) / scale;
ColorRGB finalColor = ColorRGB(0,0,0,0);
int tempCount = 0;
for (int k = 0 ; k < numberOfSamples; k++) {
tempCount++;
//If it is single sampled, then we want to cast ray in the middle of the pixel, otherwise we offset the ray by a random value between 0-1
double randomNumber = Algebra::getRandomBetweenZeroAndOne();
double xCamDir = (i - (width / 2)) + (numberOfSamples == 1 ? 0.5 : randomNumber);
double yCamDir = ((height / 2) - j) + (numberOfSamples == 1 ? 0.5 : randomNumber);
Vector3D camRayDirection = convertCameraToWorldCoordinates(Vector3D(xCamDir, yCamDir, zCamDir)).unitVector();
Ray r(camRayOrigin, camRayDirection);
finalColor = finalColor + getColorFromRay(r);
}
pixels[loopCounter] = finalColor / numberOfSamples;
loopCounter++;
}
}
CreateImage::createRasterImage(height, width, "RenderedImage.bmp", pixels);
delete pixels;      //Release memory
}

Я новичок в C ++, поэтому я очень ценю вашу помощь. Я также пытался сделать то же самое в C # в Microsoft Visual Studio, и использование памяти никогда не превышало 200 МБ. Я чувствую, что делаю какую-то ошибку. Я могу предоставить вам более подробную информацию, если вы хотите мне помочь.

0

Решение

Память выделена с использованием new [] должны быть освобождены с помощью delete [],

Ваша программа имеет неопределенное поведение из-за использования

delete pixels;      //Release memory

освободить память. Это должно быть:

delete [] pixels;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]