这是我的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个全部等于1.0的双精度数组和一个等于0的整数数组.当我运行此代码时它正确输出dos数组,但后来我得到这个错误
lattice3d:malloc.c:2451:sYSMALLOc:断言`(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) - > size&0x1)&&((unsigned long)old_end&pagemask)== 0)'失败.中止(核心倾倒)
如果我尝试同时初始化两个数组,我不会得到内存错误,但数组最终会有奇怪的值(例如:H数组看起来像[0,0,0,0,0] ,0,0,0,0,1247506]或类似的东西).移动我设置H和dos的所有值的位置,更改哪些值不正确.
你分配的int不是数组:
int* H = new int(length);
Run Code Online (Sandbox Code Playgroud)
应该:
int* H = new int[length];
Run Code Online (Sandbox Code Playgroud)
与你的double情况相同:
double* dos = new double(length);
Run Code Online (Sandbox Code Playgroud)
应该:
double* dos = new double[length];
Run Code Online (Sandbox Code Playgroud)
你在堆栈上分配的是int H(10);什么,就像int H = 10;你的双壳一样; double dos(10)就像double dos = 10.
您还泄漏了正在创建的数组/值,并且需要delete[]在程序结束时调用(请注意,这将在您执行上述更正之后):
delete[] H;
delete[] dos;
Run Code Online (Sandbox Code Playgroud)
由于这是标记的C++并且您正在使用new,因此值得注意的是,在现代C++中,通常最好避免new在可能的情况下使用.在这里,使用std::vector动态分配的数组会更好.几乎总是有一个更好的选择new,通常涉及使用标准库中的东西.