当我的数组达到一定大小时,Qt无法正常工作

时间:2018-08-27 07:01:00

标签: c++ arrays qt

出于测试目的,我正在Qt中尝试使用不同大小的数组。

这是代码:

#include <QCoreApplication>
#include <iostream>    
using namespace std;

int const sizeArray = 519199;

int main()
{    
    string arr[sizeArray];

    for(int i = 0; i < sizeArray; i++)
    {    
        arr[i] = i;
    }

    arr[499999] = "Test";
    cout << arr[499999] << endl;
}

sizeArray为519999时,程序将快速运行并显示“测试”。但是,当sizeArray为519200或更高时,该程序将花费更长的运行时间(约5秒钟),然后完成而不显示“测试”。

这是操作系统还是Qt的内存限制?

4 个答案:

答案 0 :(得分:6)

写时:

string arr[sizeArray];

您正在堆栈上创建大小为std::string的{​​{1}}类型的数组。不要在堆栈上创建如此大的数组,因为您将很快填充它;并且,您将无法在程序中做很多事情,因为您将所有局部变量都保留在堆栈中。使用动态数组,例如std::vectorQVector

以下是sizeArray的示例:

std::vector

此外,不要使用C样式的数组。如果您想要一个知道其大小且不会很大的堆栈数组(即它不应该耗尽堆栈),请改用std::array,例如所以:

std::vector<std::string> arr(sizeArray);

答案 1 :(得分:0)

您可能只是在 string arr [sizeArray];

处出现堆栈溢出

该数组太大,无法容纳在程序的堆栈地址空间中。

如果您在堆上分配数组,那么假设您的计算机具有足够的内存,那应该没问题。

string *arr = new string[sizeArray];

但是请记住,一旦使用完 arr ,将需要您删除[]数组,如下所示:

delete[] arr;

作为先前的答案,您也可以使用向量,而不是在Stack上使用大数组。为了获得更好的清晰度,您可以检查here

答案 2 :(得分:0)

除了自动存储数组数据之外,其他任何方法都可以正常工作-这就是您应该使用的:

#include <QtCore>
#include <algorithm>
#include <array>
#include <memory>

static constexpr int N = 1000000;
static constexpr size_t pageSize = 4096;

template <typename R> void fill(R &range) {
  std::generate(range.begin(), range.end(), [i = 0]() mutable {
     return QString::number(i++);
  });
  qDebug() << *std::prev(std::cend(range));
}

int main() {
  static QVector<QString> array1(N);
  QVector<QString> array2(N);
  QVarLengthArray<QString> array3(N);
  auto array4 = std::make_unique<std::array<QString, N>>();//(new std::array<QString, N>);

  static_assert(sizeof(array1) < pageSize);
  static_assert(sizeof(array2) < pageSize);
  static_assert(sizeof(array3) < pageSize);
  static_assert(sizeof(array4) < pageSize);
  fill(array1);
  fill(array2);
  fill(array3);
  fill(*array4);
}

答案 3 :(得分:-3)

您的意思是,大小为519199而不是519999可以吗?

无论如何要检查是否有堆栈限制,请尝试使用new。

字符串* arr =新字符串[sizeArray]