【问题标题】:QVector + QScopedPointer - Invalid parameter passed to C runtime functionQVector + QScopedPointer - 传递给 C 运行时函数的无效参数
【发布时间】:2020-02-28 23:14:03
【问题描述】:

我有一个方法,它生成一个巨大的QVector<uchar>(大小:354792000),并且内存是动态分配/释放的,为了方便我使用 QScopedPointer:

void someMethod(int SIZE) {
  chVec.reset(new QVector<uchar>(SIZE));
       /*doing some stuff with an array...*/
  chVec.data()->clear();
  chVec.data()->squeeze();
}

创建小尺寸数组 - 没问题,您也可以创建一个大尺寸数组,但是当我再次调用该方法时,我收到错误“传递给 C 运行时函数的参数无效”。它通过调试器,尝试为新数组分配空间时出错:

template <typename T>
QVector<T>::QVector(int asize, const T &t)
{
    Q_ASSERT_X(asize >= 0, "QVector::QVector", "Size must be greater than or equal to 0.");
    if (asize > 0) {
        d = Data::allocate(asize);
        Q_CHECK_PTR(d); /*<------ Error occured*/
        d->size = asize;
        T* i = d->end();
        while (i != d->begin())
            new (--i) T(t);
    } else {
        d = Data::sharedNull();
    }
}

数据::分配(asize); :

Q_REQUIRED_RESULT static QTypedArrayData *allocate(size_t capacity,
            AllocationOptions options = Default)
    {
        Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
        return static_cast<QTypedArrayData *>(QArrayData::allocate(sizeof(T),
                    Q_ALIGNOF(AlignmentDummy), capacity, options));
    }     

可能是什么?内存泄漏(不可能再次分配如此大的连续内存,因为之前的调用没有释放内存?)? ...我只是不明白问题是什么,在离开方法范围之前,我什至手动清理数组并释放内存...如果有任何建议,我将不胜感激

【问题讨论】:

  • 不是因为内存碎片吗?你的进程虚拟内存空间是多少?您是否调查过进程的内存分配足迹?
  • @Soheil 感谢您的回复。尽管我的程序没有超过 2 GB 的大小,但我通过将 mingw32 更改为 mingw64 解决了我的问题 - 我遇到了 badAlloc 问题

标签: arrays qt memory-management qvector qscopedpointer


【解决方案1】:

通过将mingw32改为mingw64解决了问题

【讨论】:

  • 那是内存碎片问题吗?当然,2GB 的内存可能会更早地被碎片化。
  • @Soheil,好吧,这似乎是问题所在,但我不能肯定地说。我使用资源监视器来了解我的程序使用了多少内存 - 大约 200 mb ,在向量分配后它变成 600 mb,当内存被释放时它变成 200 mb。我的猜测是:qt 在程序的生命周期内分配/释放空间,这可能导致不可能为单链表分配大部分连续内存......但这只是我的想法(对不起我的英语)
  • 任何内存消耗都可能发生内存碎片。这与使用或分配的内存量无关。这是关于如何通过虚拟内存空间分配内存。所以,我认为这是一个内存碎片。
  • @Soheil 我刚刚读到了这个,我认为 - 你是对的。谢谢你。有没有办法在运行时操纵碎片(集群大小?)?或者唯一的解决方案是保留一些额外的空间并且在程序析构函数调用之前不释放它?
  • 我不确定它是否有效。在程序执行的早期阶段为 QVector 保留连续的内存部分会有所帮助。它是关于由您的操作系统管理的虚拟内存空间,而不是物理 RAM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多