0

削除の仕組みを知りたいですか? メイン関数では、cfact object. ただしcfact->Hello()、エラーをスローする代わりに動作します。削除中に見つけたデバッグ中にcfact、メモリを解放します。factory* c2fact = newfun.Newfun("c2_fact");行が実行されるとすぐに、cfactメモリ位置が取得されます。

class factory{

public:
    virtual void Hello() = 0;
};
class c_fact: public factory
{
public:
    void Hello(){
    cout << "class c_fact: public factory"<<endl;
    }
};
class c2_fact: public factory
{
public:
    void Hello(){
    cout << "class c2_fact: public factory"<<endl;
    }
};

class callFun{
public:
    virtual factory* Newfun(string data)
    {
        if(data == "c_fact")
            {return new c_fact;}
        else
            {return new c2_fact;}
    }
};
class newFun:public callFun{
public:
    factory* Newfun(string data)
    {
        if(data == "c_fact")
            {return new c_fact;}
        else if (data == "c2_fact")
            {return new c2_fact;}
    }
};
int main()
{
    newFun newfun;
    factory* cfact = newfun.Newfun("c_fact");
    delete cfact;                              //Deleted the instance
    factory* c2fact = newfun.Newfun("c2_fact");
    cfact->Hello();//Still it prints the output
    c2fact->Hello();
    system("pause");
    return 0;
}
4

5 に答える 5

6

deleteそれが指すものを実際に無効にするわけではありません。メモリを別の用途に使用できること、およびプログラムがメモリをもう必要としないことを OS に伝えるだけです。

他のデータによって上書きされない場合、データは引き続きメモリ内にあり、アクセス可能です。これは、開発段階で検出されず、後で現れる多くのバグの原因です。

現在機能しているという事実は、それが常に機能するという意味ではありません。たとえば、コードを別のマシンに移動したり、コンピューターを再起動したりすると、コードで segfault が発生する可能性があります。

NULLafterへのポインターを設定することは常に良い習慣deleteです。またはさらに良い使用smart pointers

于 2013-04-29T12:37:48.677 に答える
1

申し訳ありませんがコメントできません...コードをコンパイルしたところ、破棄したばかりの cfact が c2fact に置き換えられていることがわかります (出力は

クラス c2_fact: パブリック ファクトリ

class c2_fact: public factory )

ところで、「cfact->Hello();」と入力すると c2fact を作成する前に、mem ブロックがどのオブジェクトにも影響されないため、プログラムがクラッシュする可能性があります (これが望ましいと思われます)。この動作は、メモリ監視やその他の実行中のプロセスによって異なる場合があることに注意してください。

于 2013-04-29T14:45:54.893 に答える