Учитывая следующий код, как я могу решить проблему владения, с которой я сталкиваюсь?
Мне нужно разобраться в этой ситуации, не делая копию Item
, потому что я не могу.
Item
и ItemContainer
являются частью API, который пользователь не должен беспокоиться о дублировании, это означает, что мне нужно дважды добавить указатель, если пользователь дважды вызывает его для одного и того же указателя.
Я думал, что мой удалитель разрешит это, но это не так.
Например, я не могу использовать unordered_set
, я должен справиться с этой ситуацией, как сейчас.
ItemContainer.h:
typedef std::unique_ptr<Item, std::function<void(Item *)>> ItemDeleter;
std::vector<ItemDeleter> items_;
ItemContainer.cpp:
void ItemContainer::addItem(Item *item)
{
ItemDeleter uniqPtrItem(item, [](Item *p) {
if (p != nullptr) {
delete p; //it's crashing here, obviously
p = nullptr;
}
});
items_.push_back(std::move(uniqPtrTask));
}
main.cpp
int main() {
Item *item = new Item();
ItemContainer itemContainer;
itemContainer.addItem(item);
itemContainer.addItem(item);
}