这是我的代码:
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:断言`(old_top ==(((mbinptr)(((char *)&amp;((av) - &gt; bins [((1) - 1)* 2 ])) - __builtin_offsetof(struct malloc_chunk,fd))))&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)&gt; =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&amp;〜((2 * (sizeof(size_t))) - 1)))&amp;&amp;((old_top) - &gt; size&amp; 0x1)&amp;&amp;((unsigned long)old_end&amp; pagemask)== 0)'失败。 中止(核心倾销)
如果我尝试同时初始化两个数组,我不会收到内存错误,但数组最终会出现奇怪的值(例如:H数组看起来像[0,0,0, 0,0,0,0,0,0,1247506]或其他相似之处)。移动我设置H和dos的所有值的位置,更改哪些值不正确。
答案 0 :(得分:6)
您正在分配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;
,对于你的双重案例也是如此; double dos(10)
与double dos = 10
类似。
您也在泄漏正在创建的数组/值,并且需要在程序结束时调用delete[]
(请注意,这将在您执行上述更正后):
delete[] H;
delete[] dos;
由于这是标记的C ++并且您使用的是new
,因此值得注意的是,在现代C ++中,通常最好避免在可能的情况下使用new
。在这里,使用std::vector
比动态分配的数组更好。使用new
通常比使用标准库中的内容更好的选择。