-4

オブジェクトのディープコピーを実装するためのコードを書いています。

これが私のコードです:

//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <string>
#include <iostream>
#include <sstream>
#include <conio.h>

using namespace std;

//---------------------------------------------------------------------------

class Wheel
{
public:
    Wheel() : pressure(32)
    {
        ptrSize = new int(30);
    }
    Wheel(int s, int p) : pressure(p)
    {
        ptrSize = new int(s);
    }
    ~Wheel()
    {
        delete ptrSize;
    }
    void pump(int amount)
    {
        pressure += amount;
    }
    int getSize()
    {
        return *ptrSize;
    }
    int getPressure()
    {
        return pressure;
    }
private:
    int *ptrSize;
    int pressure;
};

class RacingCar
{
public:
    RacingCar()
    {
        speed = 0;
        *carWheels = new Wheel[4];
    }
    RacingCar(int s)
    {
        speed = s;
    }
    RacingCar(RacingCar &oldObject)
    {
        for ( int i = 0; i < sizeof(carWheels)/sizeof(carWheels[0]); ++i)
        {
            Wheel oldObjectWheel = oldObject.getWheel(i);
            carWheels[i]=new Wheel(oldObjectWheel.getSize(),oldObjectWheel.getPressure());
        }
    }
    void Accelerate()
    {
        speed = speed + 10;
    }
    Wheel getWheel(int id)
    {
        return *carWheels[id];
    }
    void printDetails()
    {
        cout << carWheels[0];
        cout << carWheels[1];
        cout << carWheels[2];
        cout << carWheels[3];
    }
private:
    int speed;
    Wheel *carWheels[4];
};

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{

RacingCar testCar;
testCar.printDetails();

RacingCar newCar = testCar;
newCar.printDetails();

getch();
return 0;
}
//---------------------------------------------------------------------------

何らかの理由で、このコードをコンパイルした後、C++ビルダーがクラッシュします。これがクラッシュする原因となる、正しくない上記のものはありますか?コンパイルエラーはなく、プログラムがクラッシュするだけです。

4

2 に答える 2

2

問題は:

Wheel *carWheels[4];

*carWheels = new Wheel[4];

これは、に4つのホイールのみを割り当てcarWheels[0]ます。一緒に

return *carWheels[id];

が0でない場合id、前述のように、最初の要素のみが有効なポインターであるため、これは未定義の動作につながります。

これに加えて、コードはひどいです。生のポインタは避けてください。C++にははるかに優れた選択肢があります。C配列を使用する場所、std::vectorまたはstd::arrayC配列を使用する場所、および生のポインターを使用するスマートポインターを使用します。

于 2012-08-29T14:27:45.300 に答える
0

一般的に私の経験では、コンパイラ/ツールがクラッシュした場合、おそらくコンパイラの作成者がそれをチェックすることすら起こらなかったほど間違ったことをしているでしょう。

そのようなことを追跡する最良の方法は、コードが再び機能するまでコメントアウトし、問題のある部分が見つかるまでゆっくりとコードを戻すことです。

設計上の注意として、私であれば、それを使用するWheelクラスの複雑なディープコピーコンストラクターを作成するのではなく、コピーコンストラクターも実装すると思いRacingCarます。

于 2012-08-29T14:29:28.953 に答える