0

私はしばらくこれを理解しようとしてきましたが、外部の視点に立つ時が来たと判断しました。私は可能な限りグーグルで検索しましたが、同様の問題について読んだことから、これは(私が思うに)必要以上に少ないメモリを割り当てることに関係しています。私は自分のコードを何度も調べましたが、間違いがどこにあるかを見つけることができません。

私の教授は印刷関数を作成しましたが、その関数が呼び出されたときにのみ問題が発生するため、私が作成したこの関数に検索を絞り込みました。

IntStore& IntStore::operator=(const IntStore& rhs)
{
   if(this != &rhs)
   {
      int* newData = new int[rhs.capacity];
      int* newFreq = new int[rhs.capacity];
      for(int i=0; i < rhs.used; i++)
      {
        newData[i] = rhs.data[i];
        newFreq[i] = rhs.freq[i];
      }
      delete [] data;
      delete [] freq;
      data = newData; 
      freq = newFreq;
      capacity = rhs.capacity;
      used = rhs.used;
   }
   return *this;      
}

彼の印刷機能は次のように読みます。

void print_to_cout(IntStore src)
{
   // NOTE:
   // - first for-loop below looks silly but is purposely added
   // - don't try to remove/disable when doing the assignment
   // - Why is it added?
   for (int i = 1; i < 2; ++i)
   {
      src = src;
      IntStore copy1;
      copy1 = src;
   }

   int countDist = src.countDistinct();
   for (int i = 1; i <= countDist; ++i)
      cout << setw(5) << src.valAt(i);
   cout << endl;
   cout << "        (freq)";
   for (int i = 1; i <= countDist; ++i)
      cout << setw(5) << src.freqAt(i);
   cout << endl;
}

プログラムを実行すると、次のように返されます。

*** glibc detected *** ./a2: free(): invalid next size (fast): 0x0000000005714010 ***

どんな助けでも大歓迎です、そして前もって感謝します。

私の質問に役立つように、コードのより具体的な部分を示すコンストラクターを含めています。印刷機能について。なぜそのように書かれているのかはわかりません。メインの cpp ファイルはすべて教授が作成したものであり、編集することはできません。私たちが行った唯一の編集は、Instore.cpp ファイルに対するものでした。ヘッダーも既製です。

#include "IntStore.h"
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;

void IntStore::resize(int new_capacity)
{
   if(new_capacity < used)
     new_capacity = used;
   if(new_capacity < 1)
     new_capacity = 1;
   capacity = new_capacity;
   int* newData = new int[capacity];
   int* newFreq = new int[capacity];
   for(int i=0; i < used; i++)
   {
       newData[i] = data[i];
       newFreq[i] = freq[i];
   }
   delete [] data;
   delete [] freq;
   data = newData;
   freq = newFreq;
}

IntStore::IntStore(int init_capacity) : capacity(init_capacity), used(0)
{
   if(capacity < 1)
     capacity = DEFAULT_CAPACITY;
   data = new int(capacity);
   freq = new int(capacity);
}

IntStore::IntStore(const IntStore& src) : capacity(src.capacity),
                                                  used(src.used)
{
   data = new int(capacity);
   freq = new int(capacity);
   for(int i = 0; i < used; i++)
   {
     data[i] = src.data[i];
     freq[i] = src.freq[i];
   }
}

IntStore::~IntStore()
{
   delete [] data;
   delete [] freq;
}

これは print 関数の場合です。

  case 'p': case 'P':
     objectNum = get_object_num();
     switch (objectNum)
     {
     case 1:
        if ( is1.empty() )
           cout << "   is1: (empty)" << endl;
        else
        {
           cout << "   is1: (data)";
           print_to_cout(is1);
        }
        break;
     case 2:
        if ( is2.empty() )
           cout << "   is2: (empty)" << endl;
        else
        {
           cout << "   is2: (data)";
           print_to_cout(is2);
        }
        break;
     case 3:
        if ( is3.empty() )
           cout << "   is3: (empty)" << endl;
        else
        {
           cout << "   is3: (data)";
           print_to_cout(is3);
        }
     }
4

1 に答える 1

1

コピーコンストラクターにはnew int(capacity)、あるべき場所がありますnew int[capacity]。これらはまったく同じものではありません。

代入演算子にコピーとスワップのイディオムを使用することを検討するかもしれません-あなたが持っているものはほとんど正しいですが、かなり恐ろしいものであり、はるかに短くて単純なものになる可能性があります.

于 2012-07-15T08:36:50.580 に答える