2

私は現在、動的に割り当てられた独自の基本的なベクター構造体を作成する割り当てに取り組んでいます。作成する関数の 1 つは、ユーザーが値を入力したときにベクトルを拡張する関数です。

struct Vector{//vector structure
    unsigned int size;
    Elem *svector;
};

Vector *extend_vec(Vector *extend,Elem element){
    if (extend==NULL){
        return NULL;}


    Elem *tempVec=new Elem[(*extend).size];

    memcpy(tempVec,(*extend).svector,sizeof((*extend).svector));//copies memory from the original array to the temp array

    (*extend).size+=1;

    delete[] (*extend).svector;//clears the memory

    (*extend).svector=new Elem[(*extend).size];//reallocates with the new size


}

Elem=float ところで**

私の質問は、この行が必要かどうか、そしてその理由です:

 delete[] (*extend).svector;//clears the memory

このような状況でメモリがどのように上書き/再割り当てされるかについて、私は少しぼんやりしています。再割り当てが既存のものを上書きするかどうかはわかりません。

**だから私はみんなのコメントを読んで、これが私が思いついたものです.

Vector *extend_vec(Vector *extend,Elem element){
    if (extend==NULL){
            return NULL;}


    Elem *tempVec=new Elem[extend->size+1];
    tempVec[extend->size+1]=element;

     memcpy(tempVec,extend->svector,(extend->size*sizeof(Elem)));//copies the memory from the original array to the rest of the temp array

    extend->size+=1;

    delete[] extend->svector;//clears the memory

    extend->svector=tempVec;//the original vector now becomes the extended vector

    delete[] tempVec;//clears the temporary memory

    return extend;
}
4

4 に答える 4

2

何も上書きしていません。古い配列の代わりに使用する新しい、より長い配列を割り当てています。そのため、使い終わったら古いアレイを削除する必要があります。

ただし、関数の最後の行は間違っています。svector古い配列の内容を にコピーしましたが、tempVecこれを使用して置き換える代わりに、svector別の配列を割り当てます。最後の行は次のようになります。

extend->svector = tempVec;

return extend;もう 1 つ: 関数は Vector* を返すように宣言されているため、その後にステートメントが必要です。

ptr->memberところで、よりも が好ましいスタイルだと思います(*ptr).member

于 2012-11-02T05:41:43.430 に答える
2

ここに示されているコードが期待どおりに機能するとは思いません。あなたが望むのは次のとおりだと思います:

Elem *tempVec = new Elem[extend->size +1];
tempVec[extend->size] = element;
memcpy(tempVec, extend->svector, extend->size);
delete[] extend->svector;
extend->svector = tempVec;
extend->size += 1;
于 2012-11-02T05:45:54.330 に答える
1

ラインdelete[] (*extend).svector;//clears the memoryが必要ですまたあなたも解放する必要がありtempVecます delete [] tempVec;

于 2012-11-02T05:41:30.570 に答える
1

あなたが投稿したコードにはいくつかの間違いがあります。

これにより、おそらく必要なベクトルの現在のサイズに十分なスペースが割り当てられます (*extend).size + 1

    Elem *tempVec=new Elem[(*extend).size];

これは、ポインタを格納するのに必要なバイト、つまり sizeof((*extend).svector) のみをコピーします。

    memcpy(tempVec,(*extend).svector,sizeof((*extend).svector));//copies memory from the original array to the temp array

以前に保存されたすべてのバイトをコピーする必要があります。つまり、(*extend).size * sizeof(Elem)

    (*extend).size+=1;

これにより、以前に予約されたメモリがランタイムに返されます。作るたびにこれを行う必要がありnew[]ます。

    delete[] (*extend).svector;//clears the memory

次に、これは割り当てられたメモリのさらに別のブロックを指しています..しかし、以前にコピーしたブロックではありません。多分これだったはず(*extend).svector = tempVec;

    (*extend).svector=new Elem[(*extend).size];//reallocates with the new size

最後に、新しい値を新しく割り当てられたスペースにコピーすることは決してありません! つまり、次のようなものが欠けています

    (*extend).svector[(*extend).size - 1] = element;
于 2012-11-02T06:15:46.427 に答える