不确定如何声明然后访问堆内存中的 int 数组

问题描述 投票:0回答:1

我有一个巨大的数组,用于临时存储像素数据(在将其写入文件之前)。我一直遇到“随机”崩溃,并且比我更精通 C++ 的人建议我应该将像素数组放在堆中而不是堆栈中。这些对我来说都是新词,但我已经读过,这是有道理的,但我正在努力设置它。

声明堆数组:

int *heap = new int[MAX_WIDTH * MAX_HEIGHT * 3];

然后我的 Canvas 类将使用它,我想保存指向特定堆的指针:

class Canvas {
    public:
    Canvas(int w, int h, bool fill_transparent, int* heap);
    Canvas();
    
    int width;
    int height;
    
    int* heap;
}

Canvas::Canvas(int w, int h, bool fill_transparent, int* heap) {
    if (w>MAX_WIDTH) w = MAX_WIDTH;
    if (h>MAX_HEIGHT) h = MAX_HEIGHT;
    
    width = w;
    height = h;
    heap = heap;
    
    if (fill_transparent) {
        for(int x=0; x<width; ++x) {
            for(int y=0; y<height; ++y) {
                set(x, y, transparent);
                //heap->pixels[x][y] = transparent;
            }
        }
    }
}

创建一个新画布并传递堆:

Canvas new_texture(int w, int h, int* heap) {

  Canvas canvas(w, h, true, heap);

  // Do some things with it, using set(x,y);

  return canvas;

}

然后尝试设置像素数据(Pixel 是一个具有 {int r, int g, int b} 的结构:

void Canvas::set(int x, int y, Pixel colour) {
    if (x>=width || y>=height || x<0 || y <0) return;
    
    // Set the heap :C
    *heap[(x * (MAX_HEIGHT*3)) + y] = colour.r;
    *heap[(x * (MAX_HEIGHT*3)) + y + 1] = colour.g;
    *heap[(x * (MAX_HEIGHT*3)) + y + 2] = colour.b;
}

这是错误的!我只是不知道应该如何声明数组,将指针存储在类中,然后访问它。

int *heap[]
对我来说更有意义,但也不起作用。

我正在工作中学习,并且真的很难找到我应该如何做这件事的概述。

我已经尝试了我能想到的大多数变体,我正在努力寻找在所有三个地方都有效的东西!

c++ arrays memory heap
1个回答
0
投票

要访问堆的特定成员,您可以使用以下命令:

int value = *(heap + index);
int value2 = heap[index]; // where index is the place in memory you want to access

*(heap + index) = some_value;
heap[index] = some_value;

我最好的建议是熟悉 std::vector 类,除非您使用非常大的数组,因为它会为您处理内存管理,并且您始终可以像任何其他数组一样访问数组的元素.

© www.soinside.com 2019 - 2024. All rights reserved.