0

基本クラスA と派生クラスがありBます。

class A
{
    A();
    virtual ~A();
    void func1();
    virtual void func2();
};

class B : public A
{
    B();
    ~B();
    void func2();
};

int main()
{
    A* lBaseobj = new A ( );

    lBaseobj->func1( );
    lBaseobj = new B( );
    lBaseobj->func2( );

    delete lBaseobj;
return;
}

私の質問は、オブジェクトにdelete lBaseobj割り当てられたメモリを解放するかどうかです。lBaseobjnew A( )

4

3 に答える 3

3

「deletelBaseobj」は、new A()によってlBaseobjオブジェクトに割り当てられたメモリも解放しますか。

あなたの例から、NOYES 。

A削除されていないので、以下でメモリをリークします。

...
lBaseobj->func1( );  // where is delete lBaseObj; ??
lBaseobj = new B( );
...

A::~A()は仮想であるため、以下は問題ありません。

...
lBaseobj->func2( );
delete lBaseobj;
于 2012-06-25T08:29:55.180 に答える
2

いいえ、最初のオブジェクトは破棄されません。

A* lBaseobj = new A ( );
lBaseobj->func1( );
delete lBaseobj; // call delete here
lBaseobj = new B( );

経験則に従う必要があります。すべての場合に、がnew必要です。deleteすべての場合に。new[]が必要delete[]です。

コードには2つありますがnew、1つだけdeleteです。

于 2012-06-25T08:28:13.950 に答える
1

スマートポインタを使用する場合、メモリがリークすることはありません。

std::unique_ptr<A> lBaseobj(new A());
// or: auto lBaseobj = std::make_unique<A>();
lBaseobj->func1();
lBaseobj.reset(new B()); // will delete resources allocated by new A()
lBaseobj->func2();
return 1; // destructor of lBaseobj will delete resources allocated by new B()
于 2012-06-25T08:52:05.633 に答える