-22

次の場合、メモリリークは発生しますか? はいの場合、どうすれば問題を解決できますか? Baseクラス (つまり)でポインタを使用Structure* varし、デストラクタで削除する必要がありますか?

ケース 2 がメモリ リークを引き起こさない場合、どうなりStructure(0,0)ますか? それは即座に作成され、破壊されますか、それとも何か他のことが起こりますか?

ケース 1 :

struct Structure
{
    int a;
    int b;
    Structure() { a=1; b=2; }
    Structure(int num1, int num2) : a(num1), b(num2){}
};

class Base
{
    private:
        Structure var;
    public: 
        Base(Structure structure)
        {
            var = structure;
        }
};

class Derived : public Base
{
    public:
        Derived(bool boolean) : Base(boolean ? *(new Structure(0,0)) : *(new Structure(10,10))){}
};

int main()
{
    Derived derived(true);
}

ケース 2 :

struct Structure
{
    int a;
    int b;
    Structure() { a=1; b=2; }
    Structure(int num1, int num2) : a(num1), b(num2){}
};

class Base
{
    private:
        Structure var;
    public: 
        Base(Structure structure)
        {
            var = structure;
        }
};

class Derived : public Base
{
    public:
        Derived(bool boolean) : Base(boolean ? Structure(0,0) : Structure(10,10)){}
};

int main()
{
    Derived derived(true);
}
4

3 に答える 3

5

ケース1newは対応無しで持っているので漏れますdelete

ケース 2 は がないため、リークしませんnew

于 2013-04-24T14:10:40.077 に答える
2

最初のケースはかなり悪いです:

  Derived(bool boolean) : Base(boolean ? *(new Structure(0,0)) : *(new Structure(10,10))){}
                                           ^^^^                    ^^^

を動的に割り当ててStructureいますが、ポインターを保持していないため、deleteそれらを呼び出す方法がないため、メモリリークが発生します。2 番目のケースには、この問題はありません。

于 2013-04-24T14:11:58.963 に答える