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

C++: Two dynamic arrays causes memory allocation error

本文关键字:内存 分配 错误 数组 动态 两个      更新时间:2023-10-16

下面是我的代码:

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更好的选择,它通常涉及到使用标准库中的一些东西。