C++:两个动态数组导致内存分配错误

0 c++ arrays dynamic

这是我的代码:

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的所有值的位置,更改哪些值不正确.

dwc*_*las 6

你分配的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,通常涉及使用标准库中的东西.