我遇到了使用C ++程序执行的问题。首先,我正在使用MacBook Pro,使用原生g ++进行编译。
我的程序构建了一个Record *数组。每条记录都有一个多维密钥。然后它遍历每条记录以找到它的一维浮动键。
最后,给定两个多维键的间隔,它确定给定的float是否对应于此间隔中的多维键。该算法取自研究论文,实现起来非常简单。
直到计算出100,000个值,没问题,程序才能完成它的工作。但当我转到1,000,000个值时,执行崩溃。这是g ++给出的错误:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5f08dcd0
0x00000001000021ab in TestPyramid () at include/indextree_test.cc:444
这是gdb给出的完整回溯:
(gdb) backtrace full
#0 0x00000001000021ab in TestPyramid () at include/indextree_test.cc:444
test_records = #1 0x00000001000027be in main (argc=<value temporarily unavailable, due to optimizations>, argv=0x7fff5fbff8f8) at include/indextree_test.cc:83
rc = <value temporarily unavailable, due to optimizations>
progName = 0x7fff5fbff9f8 "/Users/Max/Documents/indextree_test"
testNum = 4
给定行是对函数的调用。
以下是代码示例:
Record* test_records[1000000];
float values[1000000];
int base = 0;
for (int i(0); i < 1000000; i++)
{
test_records[i] = CreateRecordBasic(i%30+10,i+i%100,"ab","Generic Payload");
if (i%30+10 > base)
base = i%30+10;
if (i+10*i > base)
base = i+10*i;
if (i > base)
base = i;
}
for (int i(0); i < 1000000; i++)
values[i] = floatValueFromKey(test_records[i]->key, base,num_char);
最后,我将相关的浮动键放在一个列表中。
问题是我电脑的限制吗?我是否以错误的方式分配内存?
感谢您的帮助,
最大
编辑:
以下是CreateRecordBasic的代码:
Record *CreateRecordBasic(int32_t attribute_1, int64_t attribute_2, const char* attribute_3, const char* payload){
Attribute** a = new Attribute*[3];
a[0] = ShortAttribute(attribute_1);
a[1] = IntAttribute(attribute_2);
a[2] = VarcharAttribute(attribute_3);
Record *record = new Record;
record->key.value = a;
record->key.attribute_count = 3;
SetValue(record->payload,payload);
return record;
}
答案 0 :(得分:0)
Record* test_records[1000000];
float values[1000000];
恕我直言,这些变量太大,无法存储在大小由您的环境定义的堆栈中。 values
占用4兆字节而test_records
占用4-8兆字节,这是相当大的堆栈空间。编译器并不完全知道系统分配堆栈的大小(这可能会因系统而异),因此您在运行时会收到错误。尝试在堆上分配它们......