2012-12-25 118 views
3

我是一个Objective-C程序员,我最近开始C++,和我偶然到这个问题,在我的代码的组织:C++对象保留?

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

stuff将是我需要的对象我的班级生活(也就是说,直到它被破坏),如何避免失去它?

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

+2

如果'stuff'应该完全一样长住为'object'它也许,它应该是在对象,只是让RAII采取其生命周期的服务。哦,ps,'new anthing'几乎总是邪恶的,所以要小心 – jozefg

+1

'thing'不会被销毁,除非你明确地删除它。我会推荐学习基础知识,以获得一个好的[C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

你会如何让“东西”淡出现状?你的意思是你在一个函数里面创建它吗? – Rubens

回答

7

,当你不需要他们不使用指针,并don't use owning raw pointers(除非你有一个非常原因他们)。

使用自动存储时间

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析构函数会被调用当thing超出范围时,隐式调用stuff的析构函数。许多good C++ books详细解释了这一点。

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

+0

值得一提的是,这只会使用C++ 11编译器编译,在GCC上您需要使用'g ++ -std = C++ 0x' – jozefg

+0

或者如果其他人需要访问同一个列表,并让事物类引用列表而不是移动它。就目前而言,移动一个新构建的对象是没有意义的。 –

1

通常的方法是在thing构造函数stuff复制或移动到thing

class thing { 
public: 
    thing(std::list<char*> stuff) : stuff(std::move(stuff)) {} 
private: 
    std::list<char *> stuff; 
}; 
1

目前尚不清楚你将如何在你的榜样使用stuff,所以我要给你有几个不同的选择。

  1. thing存储自己的副本stuff
    在这种情况下,您的班级存储std::list<char*>类型的对象。

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

    当你构建的stuffthing副本并储存在类。当物体被破坏时,它会自动释放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。 这是目标C中最像retain的方法。C++没有自动引用计数。如果要存储具有共享所有权的对象引用,则可以使用std::shared_ptrthingstd::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