glutSwapBuffers"访问冲突读取位置0x0000000004C0F000"

时间:2016-04-27 18:33:18

标签: c++ opengl glut freeglut gldrawpixels

我要做的是使用.ptm文件显示图像。

因此,我打开文件,读取W和H并将RGBA设置为每个像素。但是当我尝试显示时,我在glutSwapBuffers()发现了访问冲突错误。

这是代码。这是一团糟,因为我尝试了许多不同的东西来修复它,但我开始认为每次我都会创建一个新问题:D

image.h的

    class Image {
public:
    Image() {};
    Image(int w, int h);
    ~Image();
    void setPixel(int rgb, int x, int y) {
        pixels[x + y] = rgb;
    }
    int setRgb(int r, int g, int b);
    int setRgb(int r, int g, int b, int a);
    int getPixel(int x, int y) {
        return pixels[x + y*width];
    }
    int * getPixel() { return pixels; }
    int getWidth() { return width; }
    int getHeight() { return height; }
private:
    int *pixels; 
    int width, height;
};

Image.cpp

#include "Image.h"
#include <stdlib.h>


Image::Image(int w, int h)
{
    width = w; height = h;
    pixels = (int*)malloc(h*w);
}


Image::~Image()
{
}

int Image::setRgb(int r, int g, int b)
{
    int rgb;
    rgb = (r << 16) | (g << 8) | b;
    return rgb;
}

int Image::setRgb(int r, int g, int b, int a)
{
    int rgba;
    rgba = (a<< 24) | (r << 16) | (g << 8) | b;
    return rgba;
}

source.cpp

#include <GL\freeglut.h>
#include <GL\GL.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
#include "Image.h"

using namespace std;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    Image *img = new Image(800, 500);
    int w, h, max; //width height MaxValue
    char *w_ = new char; //in case of the file doesn't have a comment
    string fileModel, comment;
    ifstream myfile("dba.ptm"); //open the file

    if (myfile.is_open())
    {
        myfile >> fileModel;
        if (fileModel == "P7")
        {
            myfile >> w_;
            if (*w_ == '#')
                getline(myfile, comment);
            else
                w = atoi(w_);
            myfile >> h;

            int a, r, g, b, rgba;
            myfile >> max;
            for (int i = 0; i < w; i++)
            {
                for (int k = 0; k < h; k++)
                {
                    myfile >> a;
                    myfile >> r;
                    myfile >> g;
                    myfile >> b;
                    rgba = img->setRgb(r, g, b, a);
                    img->setPixel(rgba, i, k);
                }
            }
        }
    }
    myfile.close();


    glDrawPixels(img->getWidth(), img->getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, img->getPixel());
    glutSwapBuffers();
}

void init(void)
{

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 800.0, 0.0, 500.0, -1.0, 1.0);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(800, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("PTM");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;   
}

2 个答案:

答案 0 :(得分:3)

抱歉,但你有很多错误......:)

  • 您使用的是malloc而不是new[]
  • 您永远不会freedelete任何
  • 在大多数情况下(除pixels之外)你无需在堆上创建东西
  • pixels[x + y] = rgb;显然是错误的
  • 这:char *w_ = new char; //in case of the file doesn't have a comment myfile >> w_; if (*w_ == '#') ..绝对不会做你认为它做的,或者你想做什么。

可能还有更多。 :(

答案 1 :(得分:2)

malloc(h*w)应为malloc(h*w*sizeof(int)),否则您只为图片的四分之一分配足够的内存。

您似乎每隔一帧泄漏整个图像,这将很快耗尽您的可用内存。您需要freedelete分别mallocnew。{/ p>

您可能还想立即清除为图像分配的内存,以避免仅设置某些像素的问题(其余的将是随机值,这可能不如完全透明度更好)。您可以在memset之后使用std::fillmalloc执行此操作。