私のプログラムでいくつかの問題を解決しようとしています。コピーコンストラクタやデストラクタに問題があるようです。メモリ例外が発生しています。私は、文字列の道あなたをコピーするためにあなたをアドバイスしません配列のディープコピーを作成するC++
for (int i = 0 ; i < arraysize ; i ++)
{
readArray[i] = a.readArray[i];
}
私のプログラムでいくつかの問題を解決しようとしています。コピーコンストラクタやデストラクタに問題があるようです。メモリ例外が発生しています。私は、文字列の道あなたをコピーするためにあなたをアドバイスしません配列のディープコピーを作成するC++
for (int i = 0 ; i < arraysize ; i ++)
{
readArray[i] = a.readArray[i];
}
ランダムオブジェクトだけではできません。実際にコピー演算子でコピーする必要があります。
には、ヒープ割り当てストレージへのポインタが含まれている可能性があります。ビット単位でコピーすると、元の文字列のデストラクタを呼び出すと、 "コピーされた"文字列のデータが無効になります。
これを正しく行うには、std::copy
のようなものを使用します。
#include <algorithm>
...
std::copy(a.readArray, a.readArray+arraysize, readArray);
:
は、任意のヘルプは、私は、これはmemcpyの以外の配列をコピーするためのより良い方法だろう おかげ
ArrayStorage::ArrayStorage(const ArrayStorage &a):readArray(a.readArray),arraysize(a.arraysize)
{
readArray = new string[arraysize]; //create the array
memcpy (readArray,a.readArray,sizeof(string)*arraysize);//Copy the values of bytes from the location pointed at by the souce and destination.
}
ArrayStorage::~ArrayStorage(void)
{
delete[](readArray);//deconstuctor to delete the array.
}
を高く評価します行う。文字列はヒープメモリへの参照を保持するので、実際にポインタをコピーするので、両方の配列の文字列がメモリを共有しています。これはあまりC + +ではない - ishとかなり危険です。代入演算子を使用するか、文字列のコンストラクタをコピーするようアドバイスします(サイクルを実行します)。
また、ディープコピーを実行するのは 'vector
@Benjは合意しました - これは良い選択ですが、質問にはあまり関係していません - なぜこれがどうやって動作しないのかを尋ねています:) –
配列をコピーするにはどうすればよいでしょうか? –
文字列にもダイナミックメモリがあるため、各文字列を調べてそのコピーを作成する必要があります。
フィックスは、memcopyの代わりに配列内の各文字列をコピーすることです。例外は、メモリと同じポインタを持ち、両方を解放しようとする2つの異なる文字列からのものです。
そのコードは意味をなさない。最初に、初期化リストを使用して、コピーするオブジェクトによって渡された値にメンバーを初期化します。次に、同じメンバーのためにメモリを割り当て、すべてを再度コピーします。
ほとんどの場合、迷惑データを初期化されていないポインタにコピーしています。イニシャライザリスト:readArray(a.readArray),arraysize(a.arraysize)
を削除してください。
よく私が得ていたparasoftエラーのいくつかを取り除くためにイニシャライザのリストが完了しました。 –
@BrianPeach初期化リストは、メモリ例外が発生した理由です。 – Lundin
どのようにベクトルを使用せずにstd :: copyを使うでしょうか(この作業にベクトルを使うことはできません)? ごめんなさい。 –
が編集されました。ところで、初期化子リストの 'readArray'がコピーコンストラクタで役に立たない場合の初期化 - あなたはそれを本体に上書きしています。 – Mat
しかし、私は2つのエラーを取得しています。 1.オーバーロードされた関数のインスタンスはありません "std :: copy"は引数リストと一致します。 2.演算子 "+"はこれらのオペランドと一致しません。S –