2016-04-10 10 views
0

Also schreibe ich einen Raytracer in C++ mit Jetbrains Clion IDE. Wenn ich versuche, ein 600 * 600-Bild mit aktiviertem Multi-Sampling-Antialiasing zu erstellen, fehlt mir der Speicher. Ich bekomme diese Fehlermeldung:Warum geht mir der Heapspeicher aus?

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

-Code meiner Render-Funktion:

Breite: 600 Höhe: 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 
} 

Ich bin ein Anfänger in C++, so dass ich Ich würde deine Hilfe sehr schätzen. Ich habe auch versucht, das gleiche in C# in Microsoft Visual Studio zu tun und die Speicherbelegung nie überschritten 200 MB. Ich habe das Gefühl, dass ich einen Fehler mache. Ich kann Sie mit mehr Details versorgen, wenn Sie mir helfen wollen.

+0

Verwenden Sie teure Funktionen? Das kann der Grund sein, den Speicher nicht freizugeben. – Auriga

Antwort

2

Der über new [] zugewiesene Speicher muss unter Verwendung von delete [] freigegeben werden.

Ihr Programm hat Verhalten nicht definiert durch die Verwendung von

delete pixels;  //Release memory 

Speicher freizugeben. Es muss sein:

delete [] pixels; 
+0

Es tut mir leid, dass es überhaupt keinen Effekt hatte. –

+0

@sashankAryal, ich kann nichts anderes sehen, das als ein Problem herausragt. Es wird hilfreich sein, wenn Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können. –

Verwandte Themen