图像数组在第​​一个索引处崩溃,并且在其他索引处未用 0 初始化?

Array for QImage crashs at first index and isint initialized with 0 at other?

我有一个 3D 数组(缓冲区的第一个索引)用于表示为图像并为其分配内存。之后我用 0 初始化它。但是当我尝试将我的数组保存在 QImage 中然后从图像中制作一个 Pixmap 时,我的程序在第一个 bufferIndex 处崩溃并且在其他 bufferIndexes 处不是黑色(但有一些条纹) .我的问题是什么?谢谢!

#define BUFFERSIZE 8

#define SCENEHEIGHT 1024
#define SCENEWIDTH 1024

quint8 ***ringBuffer;

//allocating memory for videoBuffer
ringBuffer=(quint8 ***) malloc(BUFFERSIZE * sizeof(quint8 **));
for(int i=0;i<BUFFERSIZE;i++)
{
    ringBuffer[i]=(quint8 **)malloc(SCENEHEIGHT * sizeof(quint8 *));
    for(int y=0;y<SCENEHEIGHT;y++)
        ringBuffer[i][y]=(quint8 *)malloc(SCENEWIDTH * sizeof(quint8));
}

//initializing videoBuffer
bufferIndex = 0;
for(int i=0;i<BUFFERSIZE;i++)
    for(int y=0;y<SCENEWIDTH;y++)
        for(int x=0;x<SCENEHEIGHT;x++)
            ringBuffer[i][y][x]=0;

videoImage = new QImage(*(videoUDPSocketThread->videoSocket->ringBuffer[bufferIndex]), 
    /*crash at bufferIndex=0, no full black Image at bufferIndex= 1 to 7*/
    SCENEWIDTH, SCENEHEIGHT, QImage::Format_Indexed8);

videoImage->setColorCount(256);
for(int i = 0; i < 256; i++)
    videoImage->setColor(i, qRgb(i, 0, 0));

QPixmap::fromImage(*videoImage); //<-- crash at this point

//videoPixmap = ppiScene->addPixmap(QPixmap::fromImage(*videoImage));

编辑,新代码

videoudpsocket.h

typedef QVector<QImage> RingBuffer;

class VideoUDPSocket : public QObject
{
    Q_OBJECT

public:
    quint8 bufferIndex;

    RingBuffer ringBuffer;

private:

    RingBuffer newBuffer();
    QImage newImage();

signals:
    void videoRead(int bufferIndex);
};

#endif // VIDEOUDPSOCKET_H

videoudpsocket.cpp

VideoUDPSocket::VideoUDPSocket(QObject *parent)
    : QObject(parent)
{
    ringBuffer = newBuffer();
    bufferIndex = 0;
}

QImage VideoUDPSocket::newImage() {
  QImage image = QImage(SCENEWIDTH, SCENEHEIGHT, QImage::Format_Indexed8);
  image.setColorCount(256);
  for (int i = 0; i < 256; ++i)
    image.setColor(i, qRgb(i, 0, 0));
  return image;
}

RingBuffer VideoUDPSocket::newBuffer() {

  RingBuffer buffer;
  buffer.reserve(BUFFERSIZE);
  for (int i = 0; i < BUFFERSIZE; ++i)
    buffer.push_back(newImage());
  return buffer;
}

获取和设置 Vektor-Data:

ringBuffer.data()[bufferIndex].setPixel(x, y, max(signal%256, ringBuffer.data()[bufferIndex].pixelIndex(x,y)));

EDIT2,添加更多信息

此代码的目的是通过 UDP-Socket 获取雷达视频数据(我认为每秒 22MB),将数据从极坐标转换为笛卡尔坐标,包括偏移量和比例因子以创建雷达视频1024x1024 像素。我想我需要计算偏移量和比例因子以将数据直接保存到 1024x1024 图像,否则我需要每个雷达视频图像大约 256 MB 的数组。现在我知道我的算法太慢了,我需要改进它。

图像是连续的字节数组。您不能单独分配每一行 - 它必须全部放在一个块中。

您还不必要地在 C++ 世界中编写 C 代码。使用容器——这就是它们的用途。最后,QImage 已经是一个容器 - 没有必要手动为其缓冲区分配内存。

typedef QVector<QImage> RingBuffer;

QImage newImage() {
  const QSize kSceneSize { 1024, 1024 };
  const auto  kSceneFormat { QImage::Format_Indexed8 };
  const auto  kColorCount { 256 };

  QImage image { kSceneSize, kSceneFormat };
  image.setColorCount(kColorCount);
  for (int i = 0; i < kColorCount; ++i)
    image.setColor(i, qRgb(i, 0, 0));
  return image;
}

RingBuffer newBuffer() {
  const auto kBufferSize { 8 };

  RingBuffer buffer;
  buffer.reserve(kBufferSize);
  for (int i = 0; i < kBufferSize; ++i)
    buffer.push_back(newImage());
  return buffer;
}

class MyClass : ... {
  RingBuffer m_ring { newBuffer() };
  ...
};