以下のサンプル コードを検討してください。このクラスData
は、データの配列を格納するために使用されます。簡単にするために、vector<char>
データ メンバーとして を使用することにしました。ただし、これらのデータは、配列の最初の要素へのポインターと、もちろんこの配列の長さを必要とする外部ルーチンによって処理する必要があります。このため、関数get_data()
とも実装しましたget_length()
。
class Data
{
public:
Data(const char* sourcePtr, int sourceLength) : _data(sourcePtr, sourcePtr+sourceLength) { ; }
const char* get_data() const { return &_data.front(); }
int get_length() const { return _data.size(); }
void print() const
{
vector<char>::const_iterator it;
for(it = _data.begin(); it != _data.end(); ++it)
cout << *it;
}
private:
vector<char> _data;
};
次に、クラスを使用する次のコード サンプルを考えてみましょうData
。
int main(int argc, char** argv)
{
char* a = new char[4];
a[0] = 'b';
a[1] = 'y';
a[2] = 't';
a[3] = 'e';
Data myData(a,4);
delete[] a;
myData.print();
cout << endl;
const char* aPtr = myData.get_data();
// The following statement frees the memory allocated
// for the data member of the class Data.
delete[] aPtr;
return 0;
}
上記のステートメントdelete[] aPtr
は、クラスのデータ メンバーに割り当てられたメモリを解放しますData
。その結果、myData
オブジェクトが自動的に割り当て解除されると、 の内容vector<char>
は既に手動で割り当て解除されており、明らかにエラーSIGABRTが発生します。
コンパイラがステートメントdelete[] aPtr
をエラーとして通知するようにするにはどうすればよいですか? Data
この目標を達成するには、クラスをどのように変更する必要がありますか?