0

動的に割り当てられた配列を使用して、C++ で一連の double のクラスを作成しました。プログラムを実行すると、プログラムは正常に完了しますが、valgrind でエラーが検出されます。サイズ変更関数が呼び出されると、サイズ 8 の無効な読み取りが表示されます。

  void sequence::resize(size_type new_capacity){
    if (new_capacity == capacity){
      return;
    }else {
      if (new_capacity < used)
          used = new_capacity;
      capacity = new_capacity;
      value_type* new_vals;
      new_vals = new value_type[capacity];
      for (int i=0;i<used;i++){
          new_vals[i] = data[i];
      }
      cout<<endl;
      delete [] data;
      data = new_vals;
    }
  }

リサイズはアタッチによって呼び出されています:

  void sequence::attach(const value_type& entry){
    //Behaivoir for empty sequence
    if(used == 0){
      current_index = 0;
      used++;
      if (used > capacity)
        resize(capacity*2);
      data[current_index] = entry;     
    } 
    //Behaivoir for no current_index
    else if (!is_item()){
      current_index = used;
      used++;
      if (used > capacity)
        resize(capacity*2);
      data[current_index] = entry;
    }
    //Default behaivoir
    else {
      used++;
      if (used > capacity)
        resize(capacity*2);
      for(int i = used-1; i>current_index+1;i--)
        data[i] = data[i-1];
      advance();
      data[current_index] = entry;
    }
  }

テストプログラムで受け取ったエラーは次のとおりです。

==1919== Invalid read of size 8
==1919==    at 0x400DB3: main_savitch_4::sequence::resize(unsigned long) (sequence2.cxx:44)
==1919==    by 0x401091: main_savitch_4::sequence::attach(double const&) (sequence2.cxx:95)
==1919==    by 0x403232: test5() (sequence_exam2.cxx:538)
==1919==    by 0x40414E: run_a_test(int, char const*, int (*)(), int) (sequence_exam2.cxx:744)
==1919==    by 0x404321: main (sequence_exam2.cxx:775)
==1919==  Address 0x5a1ae50 is 0 bytes after a block of size 240 alloc'd
==1919==    at 0x4C2C037: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1919==    by 0x400C33: main_savitch_4::sequence::sequence(unsigned long) (sequence2.cxx:17)
==1919==    by 0x4030AC: test5() (sequence_exam2.cxx:520)
==1919==    by 0x40414E: run_a_test(int, char const*, int (*)(), int) (sequence_exam2.cxx:744)
==1919==    by 0x404321: main (sequence_exam2.cxx:775)
==1919== 

--leak-check=full および --read-var-info=yes を指定して valgrind を実行しようとしましたが、このエラーが発生する理由を特定できません。resize の 45 行目は次のとおりです。 new_vals[i] = data[i];

ありがとう!!!

4

2 に答える 2

1

問題は、new_capacity をチェックせずに used に設定しているため、new_capacity よりも小さい場合に問題が発生することです。

于 2013-09-01T04:41:17.627 に答える
0
if (used > capacity)
 resize(capacity*2);     //here current index=capacity i.e maxm size allocated to new_vals
  data[current_index] = entry; //current_index > capacity, this is out of reach memory for new vals and data(since data=new_vals), so you are getting invalid read.
于 2013-09-01T06:55:54.080 に答える