C ++动态声明的数组无法工作

c++ dynamically declared array fails to work

我正在尝试使用 double *data = new double[14141414]() 声明将文件数据读入动态声明的数组。请注意,这是一个相当大的文件;因此数组的大小很大。

问题是我无法将所有数据放入数组中,因为在 index=14000000 附近执行会停止。
代码编译得很好(没有错误)。我进行了调试,new return 是一个地址,不是 0 或 NULL。所以看起来内存分配没有问题(即 运行 out of memory)。我什至在没有分配数组的情况下将文件回显到屏幕上,只是为了看看我是否能够很好地阅读文件。一切看起来都不错。

然而,当我开始将数据放入数组时,程序会在接近末尾但在 运行dom 位置停止,有时它会是 14000000 有时索引会多一点有时会少一点。有几次程序 运行 很好。

有人知道这是怎么回事吗?我怀疑计算机 运行 物理内存不足,因此程序会出现这种行为。但如果是这样,那么为什么 new 运算符 return 是一个地址?如果内存分配失败,它应该 return 0 还是 NULL?

谢谢!!

更新:根据#Jonathan Potter 的要求,我将代码包含在此处。谢谢!!真是个好主意!

void importData(){

int totalLineCount = 14141414;

double *height = new (nothrow) double[totalLineCount]();
int *weight = new (nothrow) int[totalLineCount]();
double *pulse = new (nothrow) double[totalLineCount]();
string *dateTime = new (nothrow) string[totalLineCount];
int *year = new (nothrow) int[totalLineCount]();
int *month = new (nothrow) int[totalLineCount]();
int *day = new (nothrow) int[totalLineCount]();

fstream dataFile(file.location.c_str(), ios::in);
for (int i = 0; i < totalLineCount; i++) {      
  dataFile >> weight[i] 
      >> height[i] 
      >> pulse[i]
      >> year[i] 
      >> dateTime[i]; 
  } //for
dataFile.close();

delete height;
delete weight;
delete pulse;
delete dateTime;
delete year;
delete month;
delete day;

}//function end

省去很多麻烦,使用 vector

std::vector<double> data;
data.reserve(SIZE_OF_ARRAY); // not totally required, but will speed up filling the values

vector 会给你更好的调试信息,你不必自己处理内存。

您的 "new" 内存分配块需要更正如下,不需要在每行末尾添加 ()

double *height = new (nothrow) double[totalLineCount];
int *weight = new (nothrow) int[totalLineCount];
double *pulse = new (nothrow) double[totalLineCount];
string *dateTime = new (nothrow) string[totalLineCount];
int *year = new (nothrow) int[totalLineCount];
int *month = new (nothrow) int[totalLineCount];
int *day = new (nothrow) int[totalLineCount];

而你"delete"块需要更正如下:

delete [] height;
delete []weight[];
delete []pulse;
delete []dateTime;
delete []year;
delete []month;
delete []day;

我认为不正确的删除操作可能是您失败的原因。您为数组分配了内存,但通过使用 delete 的指针语法而不是使用数组语法取消分配。

这个问题的另一个可能性可能是物理内存不足,因为根据代码,您分配了大量内存,而不仅仅是您前面提到的双数组。有一个 std::string 数组,还有几个

为了更好地避免所有内存分配和取消分配障碍,您可以使用 std::vector 代替数组。在您的一条评论中,您通过比较数组和 std::vector 提出了对性能优势的关注。如果您正在使用编译器优化,(如果是 gcc -O2std::vector 将与数组相当,除非您在实现中可能会犯一些严重的错误。