-1

たとえば、画面内でドットをバウンスさせたいゲームがある場合、構築時にドットがリストに入れられ、レンダリングと移動が処理されると仮定すると、浅いコピーを作成せずにメインでこれを行うことができますか?

int main()
{ 
    for(int i = 0; i < 10; i++)
    {
        Dot * temp = new Dot();
    }

    while(!quit)
    {    
        //Handle the dot rendering and movement
    }
}

私は非常に似たようなことをしたので、リスト内のドットを削除しようとすると、あるドットが削除され、別のドットを削除しようとすると、セグメンテーション違反が発生したため、これを尋ねます。前もって感謝します!

4

2 に答える 2

1

@Ernestは正しいです。セグメンテーション違反は、コピーコンストラクタが原因ではなく、アクセスできないメモリ位置にアクセス/削除しようとしたことが原因です。これは、使用しているポインタが不正なメモリアドレスを指していることを意味します。これは、すでに削除されていることが原因である可能性があります。

コピーコンストラクターは、オブジェクトが「新規」であるかどうかを確認することはできません。とにかく、ダムコピーコンストラクターは、実装しないと一般的に生成されます(デフォルト/コピー/ムーブctorおよびコピー/ムーブ代入演算子の自動生成の条件?)。

「ダム」とは、たとえば、新しい、より一般的にはポイントされた要素で作成されたすべてのクラスインスタンスをクラスが自動的にコピーできないことを意味します。

デストラクタは、スコープの最後で、または「new」オブジェクト(動的に割り当てられたメモリ)で「delete」演算子を呼び出すときに呼び出されます。同様に、ダムデストラクタはほとんどのc++コンパイラによって自動的に実装されます。

「ダム」は、クラスが「new」で作成されたすべての変数を自動的に削除しないことを意味します。

完全性についてはこれを確認してください:三つのルールとは何ですか?

于 2013-03-17T21:43:25.753 に答える
1

以前の問題は二重削除だったようです。Dotにデストラクタがあり、そのデストラクタでメンバー オブジェクトへの 1 つ以上のポインタを削除する場合は、間違いなくコピー コンストラクタが必要です。デフォルトのコピー コンストラクターはDot、同じオブジェクトへのポインターを持つ 2 つの を残し、両方Dotの が削除されると、子ポインターが 2 回削除されます。これは確かに違法であり、しばしばセグメンテーション違反につながります。Dotそれぞれに独自の子オブジェクトを提供するコピー コンストラクターを提供する必要があるため、二重削除は発生しません。

于 2013-03-17T21:30:10.640 に答える