在C ++中将对象存储在另一个对象中的正确方法?

时间:2014-12-12 14:30:24

标签: c++ object segmentation-fault new-operator delete-operator

我有3个对象,我们称之为MainManager& ItemManager需要有一个Items数组。这些Items已添加到Manager对象的Main

我想知道我应该如何将Items传递给Manager,以便让它们在Main()函数范围之外生效,但与此同时,能够在Manager被销毁时删除它们。

注意 Item内部Manager必须是指针,因为我需要检查NULL项

到目前为止,我有类似的东西(不是实际的代码):

Main
{
    Manager* Man;
    Main()
    {
        Man = new Manager(/**/);   //i use a pointer because i need this object to persist;
        Item* it = new Item(/**/);
        Man->AddItem(it);
    }
    ~Main()
    {
        delete(Man);
    }
}

Manager
{
    Item* ItemArchive[15];
    void AddItem(Item* item)
    {
        ItemArchive[index] = item;
    }
    ~Manager()
    {
        for(int i=0;i<archiveLength;i++)
            delete(ItemArchive[i]);    //Here i get a runtime error,most probably an 
                                       //access violation,can't be more specific
                                       //because Unreal Engine doesn't give me that info
    }
}
Item
{
    //just a basic object
}

所以我的问题是,如何在Main中创建对象,然后才能在Manager内使用和删除它们?

2 个答案:

答案 0 :(得分:4)

考虑使用std::unique_ptr<Item>并将所有权从Main传递给Manager

#include <vector>
#include <memory>

class Item {};

class Manager {
    std::vector<std::unique_ptr<Item>> item_archive;
  public:
    void addItem(std::unique_ptr<Item> item){
        item_archive.push_back(std::move(item));
    }
};

int main() {
    Manager manager;
    auto item = std::make_unique<Item>();  // C++14
    //auto item = std::unique_ptr<Item>(new Item);  // C++11
    manager.addItem(std::move(item));
}

这样,当Manager被销毁而不必编写析构函数时,将删除这些项目。

我建议使用std::vector而不是数组,因为它简化了项目档案的管理。

由于您没有发布实际代码,但是使用std::vectorstd::unique_ptr而非极有可能解决问题,因此无法确定究竟是什么给您带来运行时错误。

Live demo

答案 1 :(得分:-1)

没有理由不允许Manager删除Item。您的错误可能是您超出了ItemArchive数组或删除了两次对象?自从你重新编写了问题的代码之后,很难说清楚。

我会说尝试使用你可以调试的系统,然后你会学得更快!调试器只是令人惊奇的事情。