1

それはおそらくポインター101です...しかし、答えを見つけるのは(私にとって)奇妙に難しいです。

次の例では、すべてが自動的に適切に削除されますか、それとも一部を手動で削除する必要がありますか? それも含まれていTest tます...

私の答えはイエスです。明示的に使用しない限り、すべてが解放されますnewが、確かではありません。

ありがとう。

#include <iostream>
#include <vector> 

class Obj
{
    public:
        Obj(int num) : m_num(num) {}

        int getNum() { return m_num; }

    private:
        int m_num;
};

class Test
{
    public:
        Test(Obj *po) : m_po(po) {}

        void print()
        {
            std::cout << m_po->getNum() << std::endl;
        }

    private:
        Obj *m_po;
};

class Test2
{
    public:
        Test2() {}

        void add(Obj &o)
        { m_vo.push_back(&o); }

        void print()
        {
            for (size_t i=0; i<m_vo.size(); ++i)
                std::cout << m_vo[i]->getNum() << std::endl;
        }

    private:
        std::vector<Obj*> m_vo;
};

int main(int argc, char** argv) 
{
    Obj o1(1);
    Obj o2(2);
    Test t(&o1);
    t.print();

    Test2 t2;
    t2.add(o1);
    t2.add(o2);
    t2.print();

    //Would there be other uses of those objects t and t2 that could require a manual delete () ?

  return(0);
}
4

2 に答える 2

2

あなたの分析は正確です。newまたはmallocまたは同等のものを使用していません。したがって、何かの割り当てを解除する責任はありません。

于 2013-04-20T16:13:31.440 に答える
2

はい、そこにあるすべてのオブジェクトには自動保存期間があるため、すべてが正しく破棄され、割り当てが解除されます。動的ストレージ期間を持つオブジェクト(newまたはによって作成されたものnew[]) のみ、手動で割り当てを解除する必要があります (それぞれdeleteまたはによってdelete[])。

于 2013-04-20T16:14:18.333 に答える