我有一个使用代码分配内存的程序,
data[0] = new T[column_size.back() + 1];
数据声明为
T ** data;
它可以工作一段时间,但经过6500次迭代后,会出现此错误,
std::bad_alloc
[i05-007:21393] *** Process received signal ***
[i05-007:21393] Signal: Aborted (6)
[i05-007:21393] Signal code: (-6)
[i05-007:21393] [ 0] /lib64/libc.so.6(gsignal+0x74)[0xffffffff1330a534]
[i05-007:21393] [ 1] /lib64/libc.so.6(abort+0x168)[0xffffffff1330bc14]
我试图使用try-catch块检查数据[0]的内存地址
try {
data[0] = new T[column_size.back() + 1];
} catch (const std::exception& e) {
cerr << "Iteration " << iter << ": data[0] is at " << data[0] << endl;
cerr << e.what() << endl;
abort();
}
首先,我得到一些常规的十六进制地址位置,例如
iteration 6498: data[0] is at 0xa267aec0
iteration 6499: data[0] is at 0xa26c9f70
在6500迭代中,代码产生bad_alloc错误,并且catch打印出data [0]在内存中的位置,如果转换为十进制,这是一个非常大的数字。
iteration 6500: data[0] is at 0xffffffff12a57310
是否对此有任何解释,或者是因为它已经在catch块中,所以才返回此地址?我想知道这实际上是否是有效地址。我试图将其转换为十进制,它是18446744069727417104,这是很大的。
谢谢。