0

float 値の配列へのポインターがあるとします。float *source;そのサイズは次のようにわかっています。int sourcesize;

souceから配列に要素を追加する実装済みの関数がありますinputVec

void addRecord(const float* inputVec, int& sourcesize)
{
   int inputVecSize = sourcesize;
   memmove( (float*)&(source[inputVecSize]), inputVec, sizeof(float));
}

mここで、ソース配列の th 要素から 1 つの要素をコピーして、ソースの末尾にアタッチします。上記の addRecord を使用して、以下の関数を実装しました。

// suppose m is smaller than the current sourcesize
void copyRecord(const float* source, int& m)
{
    float* temporary = new float;
    memcpy( temporary, (float*)&(source[m]), sizeof(float));
    addRecord(temporary, sourcesize);
    delete temporary;
}

memmove関数内の呼び出しaddRecordは一時変数の場所を共有しているようです。したがって、最終的には削除temporaryしない方がよいかもしれません。しかし、おそらく彼らは同じアドレスを共有していないと思うのでtemporary、この場合は削除する必要があります.

それで、temporary最後に削除する必要がありますか?

sourceまたは、 function を使用して要素を配列からその末尾にコピーするより良い方法はありますaddRecordか?

4

1 に答える 1

1

memmove()を指すメモリの内容をコピーします。temporaryそのコピーは元の に依存していないtemporaryため、 を呼び出した後に完全に安全に削除できmemmove()ます。

ただし、そもそも一時的なものは必要ありません。元の配列から直接コピーできます。

addRecord(&(source[m]), sizeof source[m]);
于 2016-11-16T23:05:40.253 に答える