Итак, у меня есть этот 2d динамический массив, содержимое которого я хочу освободить, когда закончите с ним. Однако после деструктора я продолжаю испортить кучу. Кодекс работает отлично (конечно, с утечками памяти), если я прокомментирую деструктор. (Visual Studio 2005)Проблемы с удалением 2D динамического массива в C++ (который, в конечном счете, сохраняется в векторе)
FrameData::FrameData(int width, int height)
{
width_ = width;
height_ = height;
linesize[0] = linesize[1] = linesize[2] = linesize[3] = 0;
// Initialise the 2d array
// Note: uint8_t is used by FFMPEG (typedef unsigned char uint8_t)
red = new uint8_t* [height];
green = new uint8_t* [height];
blue = new uint8_t* [height];
for (int i=0; i < height; i++)
{
red[i] = new uint8_t [width];
green[i] = new uint8_t [width];
blue[i] = new uint8_t [width];
}
}
FrameData::~FrameData()
{
// Delete each column
for (int i=0; i < height_; i++)
{
delete[] ((uint8_t*) red[i]);
delete[] ((uint8_t*)green[i]);
delete[] ((uint8_t*)blue[i]);
}
// Final cleanup
delete[] red;
red = NULL;
delete[] green;
green = NULL;
delete[] blue;
blue = NULL;
}
Я понятия не имею, что не так с кодом. Только одна вещь, где-то еще, я сделал это в цикле, где произошла катастрофа
FrameData myFrame;
std::vector<FrameData> frames;
...snipped...
frames.push_back(myFrame);
Это не должно вызывать каких-либо проблем, не так ли? Если я правильно помню, push_back делает копию вместо хранения указателя или ссылки.
PS. Да, я должен использовать векторы. Но мне не разрешают.
Дополнительная информация:
Оператор = и конструктор копирования не определен. Думаю, это причина для этой проблемы.
Почему вы бросаете указатели в деструктор? – UncleZeiv
Как определяются красный, зеленый и синий? – FireAphis
Покажите нам свой конструктор копирования и оператор = для FrameData. –