两个动态数组导致内存分配错误
C++: Two dynamic arrays causes memory allocation error
下面是我的代码:
int main()
{
int length = 10;
int* H = new int(length);
for(int i=0;i<length;i++)
{
H[i] = 0;
}
for(int i=0;i<length;i++)
cout << i << ": " << "t" << H[i] << "n";
double* dos = new double(length);
for(int i=0;i<length;i++)
{
dos[i] = 1.0;
}
for(int i=0;i<length;i++)
cout << i << ": " << dos[i] << "t" << H[i] << "n";
return 0;
}
我试图创建一个双精度数组,它们都等于1.0和一个整数数组,它们都等于0。当我运行这段代码时,它正确地输出了dos数组,但随后我得到了这个错误
lattice3d: malloc_c:2451: sYSMALLOc: Assertion ' (old_top == ((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])))- __builtin_offsetof (struct malloc_chunk, fd)))) &&;Old_size == 0) || ((unsigned long)(Old_size)>= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) &~((2 * (sizeof(size_t))) - 1)) &&((old_top) ->大小,0 x1),,((unsigned long)old_end &Pagemask) == 0)'失败。Aborted (core dump)
如果我尝试同时初始化两个数组,我不会得到内存错误,但数组最终会在它们内部产生奇怪的值(例如:H数组看起来像[0,0,0,0,0,0,0,1247506]或类似的东西)。移动我设置的所有H和dos的值,改变了哪些值是不正确的。
您正在分配一个int
而不是一个数组:
int* H = new int(length);
应:int* H = new int[length];
与double
相同:
double* dos = new double(length);
应:double* dos = new double[length];
如果它被分配到堆栈上,你正在做的是int H(10);
,就像int H = 10;
一样,对于你的双case也是一样的;double dos(10)
和double dos = 10
一样。
您还泄漏了您正在创建的数组/值,并且需要在程序结束时调用delete[]
(注意,这将是在您执行上述更正之后):
delete[] H;
delete[] dos;
因为这被标记为c++,而你正在使用new
,值得注意的是,在现代c++中,通常最好尽可能避免使用new
。在这里,使用std::vector
比使用动态分配的数组要好。总有一个比new
更好的选择,它通常涉及到使用标准库中的一些东西。
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配