我对对象引用有些困惑。请检查以下示例:

class ListHandler {
public:
   ListHandler(vector<int> &list);
private:
   vector<int> list;
}

ListHandler::ListHandler(vector<int> &list) {
   this->list = list;
}


由于内部

vector<int> list;


定义,在这里我会浪费内存吧?所以正确的是:

class ListHandler {
public:
   ListHandler(vector<int>* list);
private:
   vector<int>* list;
}

ListHandler::ListHandler(vector<int>* list) {
   this->list = list;
}

ListHandler::~ListHandler() {
   delete list;
}


基本上我想要的就是创建一个向量并将其传递给ListHandler。除了ListHandler本身之外,不会在其他任何地方使用此向量,因此我希望ListHandler可以进行所有其他操作和清理等工作。

最佳答案

这取决于您是否要共享底图矢量。总的来说,我认为最好避免尽可能地共享,因为它消除了对象所有权的问题。不共享:

ListHandler类
{
    上市:
        ListHandler(const std :: vector &list):_list(list){}
        〜ListHandler(){}
    私人的:
        std :: vector _list;
};


请注意,与您的示例不同,我将其命名为const,因为原始文件将不会被修改。但是,如果我们希望坚持并共享相同的基础对象,则可以使用如下所示的内容:

ListHandler类
{
    上市:
        ListHandler(std :: vector &list):_list(&list){}
        〜ListHandler(){}
    私人的:
        std :: vector * _list;
};


请注意,在这种情况下,我选择让调用者保留为对象的所有者(因此,确保列表在处理列表对象的整个生命周期中都存在,并且稍后将其释放,这是调用者的责任。您接管所有权的示例也是有可能的:

ListHandler类
{
    上市:
        ListHandler(std :: vector * list):_list(list){}
        ListHandler(const ListHandler&o):_ list(新std :: vector (o._list)){}
        〜ListHandler(){删除_list; _list = 0; }

        ListHandler&swap(ListHandler&o){std :: swap(_list,o._list);返回* this; }
        ListHandler&operator =(const ListHandler&o){ListHandler cpy(o);返回swap(cpy); }
    私人的:
        std :: vector * _list;
};


尽管上述当然是可能的,但我个人不喜欢它……对于不只是智能指针类的对象获取指向另一个对象的指针的所有权,我感到困惑。如果这样做的话,可以通过将std :: vector包装在智能指针容器中来使其更加明确,如下所示:

ListHandler类
{
    上市:
        ListHandler(const boost :: shared_ptr &list):_list(list){}
        〜ListHandler(){}
    私人的:
        boost :: shared_ptr _list;
};


我发现以上在传达所有权方面更加清晰。但是,所有这些通过列表传递的不同方式都是可以接受的……只要确保用户知道谁将拥有什么。

09-05 23:37