1

我对 Ubuntu 上的 glibc 有一个非常奇怪的问题。

示例程序 test.cpp:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

bool abc(string unitstr,int *data)
{        

}

int main(int argc,char *argv[])
{

  int *dd3 = new int(8); 
  dd3[0]=1;dd3[1]=2;dd3[2]=3;dd3[3]=4;
  dd3[4]=5;dd3[5]=6;dd3[6]=7;dd3[7]=8;
  abc("sss",dd3);

  return 1;
}

编译并运行:

g++ test.cpp
a.out

结果:

a.out: 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)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Abort (core dumped)
4

3 回答 3

6

有了这条线:

int *dd3 = new int(8);

您正在分配和初始化一个标量,而不是一个数组:一个单一的,用valueint初始化。 8

你需要:

int *dd3 = new int[8];
于 2012-08-06T04:23:40.417 回答
6
int *dd3 = new int(8);

该语句只为单个整数分配空间(然后用数字 8 对其进行初始化)。然后,您继续使用这个指针,就像一个更大的数组一样,导致未定义的行为,可能(实际上,似乎)稍后会表现出来。

在这里使用new似乎没有必要(如果没有别的,也是异常不安全的)。只需使用 avector并完成它(如果您希望能够在函数内调整块的大小,只需传递向量而不是指针)。

于 2012-08-06T04:23:48.587 回答
6

此行分配一个并将 int其初始化为 value 8

int *dd3 = new int(8);

如果你想要一个 8 的数组,ints请改为:

int *dd3 = new int[8];

完成后不要忘记正确返回内存:

delete [] dd3;
于 2012-08-06T04:24:00.570 回答