私はしばらくこれを理解しようとしてきましたが、外部の視点に立つ時が来たと判断しました。私は可能な限りグーグルで検索しましたが、同様の問題について読んだことから、これは(私が思うに)必要以上に少ないメモリを割り当てることに関係しています。私は自分のコードを何度も調べましたが、間違いがどこにあるかを見つけることができません。
私の教授は印刷関数を作成しましたが、その関数が呼び出されたときにのみ問題が発生するため、私が作成したこの関数に検索を絞り込みました。
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);
}
}