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);

配列ではなく、スカラーを割り当てて初期化しています。intで初期化された単一の。 8

必要なもの:

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

このステートメントは、単一の整数にスペースを割り当てるだけです (そして、数値 8 で初期化します)。次に、このポインターをより大きな配列のように使用すると、未定義の動作が発生し、後でそれ自体が現れる可能性があります (実際、そのように思われます)。

ここでの使用newは不要のようです (そして、他に何もないとしても、例外は安全ではありません)。a を使用するだけvectorで完了です (関数内でブロックのサイズを変更できるようにしたい場合は、ポインターの代わりにベクトルを渡すだけです)。

于 2012-08-06T04:23:48.587 に答える
6

この行は、シングル を割り当てint、値に初期化します8:

int *dd3 = new int(8);

8 個の配列が必要な場合intsは、代わりに次のようにします。

int *dd3 = new int[8];

完了したら、メモリを正しく返すことを忘れないでください。

delete [] dd3;
于 2012-08-06T04:24:00.570 に答える