1 c++
我在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;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行:
g++ test.cpp
a.out
Run Code Online (Sandbox Code Playgroud)
结果:
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)
Run Code Online (Sandbox Code Playgroud)
有了这条线:
int *dd3 = new int(8);
Run Code Online (Sandbox Code Playgroud)
你正在分配和初始化一个标量,而不是一个数组:一个int用值 初始化的数组8.
你需要:
int *dd3 = new int[8];
Run Code Online (Sandbox Code Playgroud)
int *dd3 = new int(8);
Run Code Online (Sandbox Code Playgroud)
此语句仅为单个整数分配空间(然后使用数字8初始化它).然后,您继续使用此指针,就像一个更大的数组,导致未定义的行为,可能(实际上,似乎)稍后表现出来.
new在这里使用似乎是不必要的(例外 - 不安全,如果没有别的).只需使用a vector并完成它(如果您希望能够在函数内调整块的大小,只需传递向量而不是指针).
该行分配一个单一的 int,并将其初始化值8:
int *dd3 = new int(8);
Run Code Online (Sandbox Code Playgroud)
如果你想要一个8的数组,ints请改为:
int *dd3 = new int[8];
Run Code Online (Sandbox Code Playgroud)
完成后不要忘记正确返回内存:
delete [] dd3;
Run Code Online (Sandbox Code Playgroud)