0

私は C++ が初めてなので、ウィキペディアの例を参考にして学習しようとしています。クラスで少し遊んだところ、セグメンテーション違反エラーが発生しました。

これが私のコードです:

class SomeClass {};

class AnotherClass {
    SomeClass* sc
    public:
        AnotherClass(SomeClass* SC):( sc = SC; ){}

        //***********************************************************************
        ~AnotherClass(){ delete sc; } //here I'm getting rid of internal pointer
        //***********************************************************************
};

int main( int argc, char* argv[] ) {
    SomeClass* SC = new SomeClass();
    AnotherClass* AC = new AnotherClass(SC);

    delete AC;

    // *****************************************************
    delete SC; //i think that this line might cause an error
    //******************************************************

    return 0;
}

deleteヒープメモリを解放するには、すべてのポインターを使用する必要があると思いました。私の間違いを指摘していただけませんか。

編集:

これが私の実際のコードです:

#include <iostream>
#include <string>

using namespace std;

class Pizza {
    string dough;
    public:
        Pizza(string d):dough(d) {}
            void setDough( string value ) { dough = value; }
            string getDough() { return dough; }
};

class PizzaBuilder {
    Pizza* pizza;

    public:
        PizzaBuilder( Pizza* p ) { pizza = p; }
        ~PizzaBuilder() { delete pizza; cout << "PizzaBuilder Destructor." << endl;}

        PizzaBuilder* addExtra(string extra) { 
            string special = pizza->getDough() + " and extra " + extra;
            pizza->setDough(special);
            return this;
        }
        Pizza* getPizza() { return pizza; }
    };

int main(int argc, char* argv[]) {

    Pizza* p = new Pizza("My Special DOVE!");
    PizzaBuilder* pb = new PizzaBuilder(p);

    pb->addExtra("Mushrooms")->addExtra("Anchovies")->addExtra("Zefir")->addExtra("Chilli");

    cout << p->getDough() << endl;

    delete pb;
    delete p;

    return 0;
}
4

3 に答える 3

9

deleteご想像のとおり、ポインターは削除されません。ポインターが指すオブジェクトを削除します。したがって、 が指すオブジェクトをSC2 回削除しています。1mainつは が指すオブジェクトのデストラクタから、もう 1 つは が指すオブジェクトACを削除するときに自動的に呼び出されます。

また、オブジェクトを複数回削除することは未定義の動作です。

于 2013-09-03T14:32:46.470 に答える
4

オブジェクトの所有者を決定する必要があります。デストラクタで与えられたオブジェクトAnotherClassを所有したいようです。double ing は未定義の動作を引き起こします。SomeClassdeletedeletemain()delete

これを回避する最善の方法はstd::shared_ptr、メモリ内の同じオブジェクトへの複数の参照を管理する を使用することです。

#include <memory>

class SomeClass {};

class AnotherClass {
    std::shared_ptr<SomeClass> sc
    public:
        AnotherClass(std::shared_ptr<SomeClass> SC): sc(SC){}

        //***********************************************************************
        ~AnotherClass(){ /* nothing */}
        //***********************************************************************
};

int main( int argc, char* argv[] ) {
    std::shared_ptr<SomeClass> SC(new SomeClass());
    std::shared_ptr<AnotherClass> AC(new AnotherClass(SC));


    return 0;
}

への呼び出しがないことに注意してくださいdelete

于 2013-09-03T14:35:58.227 に答える