3

私はObjective-Cプログラマーであり、最近C ++を開始しました。コードの編成について、次の質問に遭遇しました。

std::list<char *> stuff = std::list<char *>();
thing *object = new thing(stuff);

stuffクラスの存続期間中(つまり、破壊されるまで)に必要なオブジェクトはどこにありますか?それを失うことを回避するにはどうすればよいですか?

-retainObjective-Cでは、コンストラクターを呼び出すだけで済みます。C ++では?

4

3 に答える 3

7

必要のないときはポインターを使用しないでください。また、(非常に正当な理由がない限り)所有している生のポインターを使用しないでください。

自動保存期間を使用する:

std::list<char> stuff;
thing object{stuff};

のコンストラクターは、その引数として次のようにthingなります。std::list<char>

#include <utility> // for std::move

class thing {
public:
    explicit thing(std::list<char> stuff_) : stuff(std::move(stuff_)) {}

private:
    std::list<char> stuff;
};

このようにすると、スコープ外にthingなるとのデストラクタが呼び出され、暗黙的にのデストラクタが呼び出されます。多くの優れたC++の本は、これを非常に詳細に説明しています。thingstuff

Objective-Cとは異なり、C++は参照カウントではなくRAIIを使用します。基本的なルールは次のとおりです。可能な場合は自動保存期間を使用し、生の所有ポインターを避けnew、正当な理由がない限り使用しないでください。

于 2012-12-25T00:46:36.617 に答える
1

通常の方法は、 :のコンストラクターにコピーまたは移動することstuffです。thingthing

class thing {
public:
    thing(std::list<char*> stuff) : stuff(std::move(stuff)) {}
private:
    std::list<char *> stuff;
};
于 2012-12-25T00:47:26.377 に答える
1

例でどのように使用するかは明確ではないstuffため、いくつかの異なるオプションを示します。

  1. thingの独自のコピーを格納しますstuff
    この場合、クラスは type のオブジェクトを格納しますstd::list<char*>

    class thing
    {
    public:
      thing(std::list<char*>& aList):m_list(alist){}
      std::list<char*> m_list;
    };
    

    作成するとthing、 のコピーstuffが作成され、クラスに格納されます。オブジェクトが破棄されると、自動的に解放されますm_list

  2. thingへの弱参照を格納しstuffます。
    クラスはポインタ ( std::list<char*>* m_list) または参照 ( std::list<char*>& m_list) を格納します。thingはあなたのリストを何らかの方法で使用できますが、リソース管理を担当するべきではありません。リストがそれよりも小さいスコープにある場合はthing、ハンギング リファレンスが残ります。

    thing getThing()
    {
    std::list<char*> list1;
    thing object1(list1);
    return object1; //bad - list will be deallocated, object1 will have a hanging reference
    }
    
  3. thingへの共有ポインタを格納しますstuff。これは、Objective C に最も似ているメソッドですretain。C++ には自動参照カウントがありません。所有権を共有してオブジェクト参照を保存する場合は、std::shared_ptr. thingstd::shared_ptr<std::list<char*>> m_list

    std::shared_ptr<std::list<char*>> stuff = std::make_shared<std::list<char*>>();
    thing object(stuff); //reference count incremented, even if stuff is destroyed object will still hold a valid reference
    
于 2012-12-25T01:10:56.687 に答える