3

我是一名 Objective-C 程序员,最近开始使用 C++,我在我的代码组织中偶然发现了这个问题:

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

stuff我在班级的整个生命周期中需要的对象在哪里(也就是说,直到它被破坏),如何避免丢失它?

在 Objective-C 上,我可以简单地调用-retain构造函数。在 C++ 上?

4

3 回答 3

7

不要在不需要指针时使用它们,也不要使用拥有原始指针(除非您有充分理由使用它们)。

使用自动存储期限

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

的构造函数thingstd::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;
};

如果你这样做,thingthing超出范围时将调用 的析构函数,隐式调用 的析构函数stuff。许多优秀的 C++ 书籍都非常详细地解释了这一点。

与 Objective-C 不同,C++ 使用 RAII 而不是引用计数。new基本规则是:尽可能使用自动存储持续时间,避免原始拥有指针,除非你有充分的理由,否则不要使用。

于 2012-12-25T00:46:36.617 回答
1

通常的方法是复制或移动stuffthing的构造函数中thing

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.
    在这种情况下,您的类存储一个类型为 的对象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。这是与retainObjective C 中最相似的方法。C++ 没有自动引用计数。如果要存储具有共享所有权的对象引用,可以使用std::shared_ptr. thing商店std::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 回答