0

プログラムがメモリを正しく割り当てているかどうかを確認しようとしています -

だから私はさまざまなタイプの一連のポインタを持っています、

pData1 = 0x844c458 ( malloc(5 * (double*) のサイズ) の結果)

pData2 = 0x844c470 (malloc の結果((double ) の 10 サイズ));

pData3 = 0x844c3a0(malloc(44 * サイズ 0f (double*)) の結果);

pData4 = 0x844c358

だから私はダブル= 8バイト、5 * 8 = 40バイトだと思います。これは、最初の2つのアドレスが重複し、同様に最後の2つが重複することを意味しますか?

無料で無効になっているため、コードのメモリ破損を調査しているため、これが発生している場所を見つけようとしています。

-----編集 ------- コード詳細の追加

これは構造体です -

struct _ELEMENT
 {
 short s;
 char arr[20];
 int size;
 void *ptr1;
 void *ptr2;
 }ELEMENT;

Parent と Derived (親の子) の 2 つのクラスがあります。

Class Parent
{ 
protected:
int size;
 ELEMENT *ele1;
ELEMENT *ele2;

 public:
 void func();
...
 }
Class Child::public Parent
{
 int a,b,c;
 }
 Parent::Parent()
 {
  ele1 = NULL;
  ele2= NULL;
 }

  Parent::~Parent()
  {
   for (int i =0; i< size; i++)
   {
    free(ele1[i].p1);
    free(ele2[i].p1);
   }
   free(ele1);
   free(ele2); 
  }
  Child::Child()
  {
   a=0;...
  }
  Child::~Child()
  {
   for (int i =0; i< size; i++)
   {
    free(ele1[i].p1);
    free(ele2[i].p1);
   }
   free(ele1);
   free(ele2); 
  }

 Parent::func ()
{
 ele1 = (ELEMENT*)malloc (n * sizeof(ELEMENT));   
 ele2 = (ELEMENT*)malloc (n* sizeof(ELEMENT));

  for (int i =0; i <somenumber; i++)
 {
   ...some processing...
   ele1[i].size = n;
   ele2[i].size = x;
   ele1[i].p1 = malloc (ele1[i].size);
   ele2[i].p1 = malloc(ele2[i].size);
  }
 }

main ()
{
  Parent *p;
  CHild *c;

  p = new Parent();
  c= new Child();

  p->func();
  c->func();

  delete(p);
 delete(c);
}

_glibc:invalid フリーは、最初に親デストラクタから解放されます。このコードは何年もの間、SOLaris で問題なく動作していましたが、Linux に移植するとこの問題が発生します...

ありがとう!

4

3 に答える 3

1

あなたの質問に対する答えは、プログラムがメモリを正しく割り当てているということです。最初の問題は、データ型のサイズがわからないため、計算が正しくないことです。

コードと実際に発生したエラーを投稿していただければ、これを解決できる可能性があります。このままでは、の根深い問題にinvalid free答えられない。

誰にとって、これは答えですか、それともコメントですか?

于 2013-03-13T20:08:15.620 に答える
1
  1. sizeof(double)は 8 バイトで、sizeof(double*)4 です (32 ビット システムの場合)。
  2. によって取得されたメモリmallocは、その間に解放されない限り重複しません。
  3. valgrindなどのメモリ デバッガーを使用する
于 2013-03-13T20:13:00.863 に答える
0

そのように見えます...どうやってこれらのポインターにたどり着きましたか? 原則として、同じスペースを指している異なるポインターを持つことは問題ありません。 malloc(またはcalloc) が割り当てられたポインター以外から「解放」するべきではありません。glibc は実際には、ブロックの大きさなどを示す「ポインタのすぐ下」にいくつかのデータを保持するため、「きれいに」解放できます。ポインターの値を変更すると、ブロックの大きさに関する情報が利用できないため (ポインターが変更されていない場合のみ)、「ブロックの一部を解放する」ことはできません。それがあなたの問題の原因でしょうか?

于 2013-03-13T19:58:57.570 に答える