【问题标题】:Dynamic allocation of QImage arrayQImage数组的动态分配
【发布时间】:2014-08-20 21:37:45
【问题描述】:

我需要为 QImage 数组动态分配内存。

它在 Linux 中对我有用:

void Arrange_Images(int numOfCams, int numBoards)
{
     QImage * array_of_images[numOfCams*numOfBoards];
     .
     .
     .
 }

但 Windows 无法解决此问题,并将其标记为错误。 对于标准数组,我可以使用 malloc,但这是一个 QImage 数组。 在此之后,每个单元格将被图像填充以进行重新排序和进一步处理。 感谢您的帮助。

【问题讨论】:

  • 粘贴错误信息。
  • 一些建议: 1. 上面不是QImage 数组,它是指向Qimage指针 数组。 2. 你不应该在 C++ 中使用malloc。 3. 对于原始内存管理,您应该使用new,但您确实应该避免在现代 C++ 的应用程序代码中进行原始内存管理。 4. 使用QImage,您不必使用指针,因为它是一个轻量级的写时复制类,因此您可以在可能的情况下使用值。 5. 在现代 C++ 中也应该避免使用 C 风格的数组,而在 Qt 中,如果你真的想要固定大小的数组,你可以使用嵌套的QList,或std::vector,或std:array
  • 而且,它可以在 Linux 上运行可能是因为您使用了一个编译器,该编译器支持 C 风格的可变长度数组 (VLA) 和 C++。它不是标准的 C++,而是特定编译器提供的扩展。
  • 在编译之前,我不知道我将使用多少 QImage。我在 Linux 中有一个工作代码,现在我正试图将它转移到 Windows。我会让它按原样工作,然后改进它。

标签: c++ c arrays qt4 qimage


【解决方案1】:

我认为 Visual Studio 编译器仍然无法在堆栈上分配动态内存量(我认为 C++03 不允许这样做,而 C99 则允许)。您可以使用_malloca 作为类比。或者只是切换到在 Windows 上使用 gcc

【讨论】:

    【解决方案2】:

    问题在于您的动态数组并不是真正动态的。

    array_of_images 是指向 QImage 对象的指针的静态数组,静态数组的大小必须在编译时知道 - 这个大小在你的情况下是未知的,因为你的数组的大小取决于Arrange_Images()函数的输入参数。

    如果你想创建一个动态分配的 QImage 对象数组,你应该这样做:

    QImage* array_of_images = new QImage[numOfCams*numOfBoards];
    

    我还会考虑您是否真的需要一个动态分配的数组并且不能用 std::vector 之类的东西替换它。

    如果 Linux 编译器真的允许它以这种形式出现,我不知道为什么在我看来它不应该编译。

    【讨论】:

    • 好的,感谢您的帮助,经过几次尝试,它确实对我有用:QImage ** array_of_images; *array_of_images = new QImage[numOfCams*numOfBoards]; array_of_images 是指向 QImage 单元的指针数组(每个 QImage 单元都是一种指针)。
    • 这就是我要在更新中写的——你可能想要一个指向 QImage 对象的指针数组,而不是 QImage 对象的数组;)
    【解决方案3】:

    要使其快速运行,请尝试使用此行而不是您现在的行:

    std::vector<QImage*> array_of_images(numOfCams*numOfBoards);
    

    当然,您也需要#include &lt;vector&gt;。其余代码应保持相同,因为std::vector 将在超出范围时自行取消分配(但不是其中的指针指向的内容!),就像您当前的 C 样式数组一样。

    【讨论】:

    • 谢谢!我稍后会尝试。这是个好主意,我想你使用vector或qlist。
    • @DmitryKezin 好吧,使用QListstd::vector 确实是偏好和风格的问题,在Qt C++ 代码中都可以。
    猜你喜欢
    • 2020-03-06
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2015-03-09
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多