Проблема выделения памяти в C ++ в Visual Studio Express

0

Я создаю фиктивное изображение и возвращаю значение изображения как одномерный массив. Но поскольку размер изображения большой. Я хотел выделить память и отпустить ее сам. Начнем с публикации. Я получил код для распределения памяти и де-распределения. Я немного изменился в соответствии с моими требованиями. Но выход неожиданно прекращается. Любое предложение было бы очень полезно!

Класс Memory_Allocator

class Allocate_Memory
{
public:

    /*Allocate and de-allocate memory for 3D arrays*/
    double*** Allocate3D(int Color, int Height, int Width);
    void Deallocate3D(double*** arr3D, int Height, int Width);

    /*Allocate and de-allocate memory for 1D array*/
    double* Allocate1D(int Total_Size);
    void Deallocate1D(double* arr1D);
};

Реализация

/*Allocate memory for 3D array*/
double*** Allocate_Memory::Allocate3D(int Color, int Height, int Width)
{
    double ***arr3D;
    int i, j;

    arr3D = new double**[Color];

    for (i = 0; i<Height; ++i)
    {
        arr3D[i] = new double*[Height];
        for (j = 0; j<Width; ++j)
        {
            arr3D[i][j] = new double[Width];
        }
    }

    return arr3D;
}

/*De-allocate memory for 3D array*/
void Allocate_Memory::Deallocate3D(double*** arr3D, int Color, int Height)
{
    int i, j;

    for (i = 0; i<Color; ++i)
    {
        for (j = 0; j<Height; ++j)
        {
            delete arr3D[i][j];
        }
        delete [] arr3D[j];
    }
    delete [] arr3D;
}

/*Allocate memory for 1D array*/
double* Allocate_Memory::Allocate1D(int Total_Size)
{
    double *arr1D;
    arr1D = new double[Total_Size];
    return arr1D;
}

void Allocate_Memory::Deallocate1D(double *arr1D)
{
    delete [] arr1D;
}

Применение

 void Create_Dummy_Marvin_Image::Create_Marvin()
{

    Marvin_Image_1 = Allocate_Memory.Allocate3D(2, 5, 5);
    Marvin_Single_Image_1 = Allocate_Memory.Allocate1D(50);
    int x = 0; //Random value initialisation
    for (int c = 0; c < Color; ++c)                  //Iterating through color values
    {
        for (int h = 0; h < Height; ++h)             //Iterating through height of the image
        {
            for (int w = 0; w < Width; ++w)          //Iterating through width of the image
            {
                ++x;                                 //Incrementing the value of x
                Marvin_Image_1[c][h][w] = (double)x;   //Setting the value in the arrays to form marvin image with random values
                Marvin_Single_Image_1[c*Height*Width + h*Width + w] = Marvin_Image_1[c][h][w]; //Setting the data to a single dimensional array of marvin image
                //cout << "\n Marvin image :" << int(Marvin_Single_Image_1[c*Height*Width + h*Width + w]); //Displaying the data in each array element
                cout << "\n Marvin image :" << int(Marvin_Single_Image_1[c*Height*Width + h*Width + w]); //Displaying the data in each array element
            }
        }
    }
    Allocate_Memory.Deallocate3D(Marvin_Image_1, Height, Width);
    Allocate_Memory.Deallocate1D(Marvin_Single_Image_1);
}

отладка

При попытке отладки у меня возникает проблема в любой момент кода, но выполнение останавливается с

'Image_Conversion.exe' (Win32): Loaded 'C:\Users\padmanab\Documents\VPadmanabhan\Marvin_To_UnsignedChar\Release\Image_Conversion.exe'. Symbols loaded.
'Image_Conversion.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Symbols loaded.
'Image_Conversion.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Symbols loaded.
'Image_Conversion.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Symbols loaded.
'Image_Conversion.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr120.dll'. Symbols loaded.
'Image_Conversion.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp120.dll'. Symbols loaded.
The program '[4972] Image_Conversion.exe' has exited with code 0 (0x0).
  • 2
    Почему вы используете malloc в C ++? Кроме того, вы должны использовать умные указатели (как минимум) или использовать существующие контейнеры библиотеки.
  • 0
    @crashmstr Привет, спасибо за ваш ответ. Было бы здорово, если бы вы могли привести меня с подобным примером, используя умные указатели.
Теги:
arrays
visual-c++
memory-management

1 ответ

0

Я не понимаю ваши рассуждения, используя 3D-массив. почему вы делаете свою жизнь излишне трудной, чем это могло бы быть? если у вас есть изображение с а и высотой, просто выделите память:

const unsigned size = width*height*colorChannels;
    char* imageBuffer = new char[size];
//iterate over it
for( unsigned i = 0; i < size; ++i )
  imageBuffer[i] = 0;

если вы действительно хотите использовать 3D-массивы:

int main()
{
    unsigned x = 2, y = 2, z = 2;
    int colorVal = 1;
    char*** arr = new char**[x];
    for( unsigned w = 0; w < x; ++w )
    {
        arr[w] = new char*[y];
        for( unsigned h = 0; h < y; ++h )
        {
            arr[w][h] = new char[z];
            for( unsigned s = 0; s < z; ++s )
            {
                arr[w][h][s] = colorVal++;
            }
        }
    }

std::cout << "value: " << (int)arr[0][0][0] << std::endl;
std::cout << "value: " << (int)arr[0][0][1] << std::endl;

std::cout << "value: " << (int)arr[0][1][0] << std::endl;
std::cout << "value: " << (int)arr[0][1][1] << std::endl;

std::cout << "value: " << (int)arr[1][0][0] << std::endl;
std::cout << "value: " << (int)arr[1][0][1] << std::endl;

std::cout << "value: " << (int)arr[1][1][0] << std::endl;
std::cout << "value: " << (int)arr[1][1][1] << std::endl;

//deletion
for( unsigned w = 0; w < x; ++w )
{
    for( unsigned h = 0; h < y; ++h )
       delete arr[w][h];
    delete [] arr[w];
}
    delete [] arr;
}
  • 0
    Привет. Большое спасибо за ваш добрый ответ. Это именно то, что я сделал и обновил в своем отредактированном вопросе. Все же выполнение неожиданно останавливается
  • 0
    Я не могу прокомментировать ваш код в вопросе, но ваш оператор удаления в цикле for (так что я думаю) не верен! Правильный порядок: Удалить, удалить [], удалить []. Элементы, хранящиеся в массиве, должны быть удалены без "[]"
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню