Mir ist beim Überfliegen aufgefallen, dass du die Arrays im Destruktor nicht korrekt deallozierst:

Code:
    ~ImageData()
    {
        delete r;
        delete g;
        delete b;
    }
Korrekt wäre:

Code:
    ~ImageData()
    {
        delete[] r;
        delete[] g;
        delete[] b;
    }