c++ - 如何从 unique_ptr 中删除原始指针

标签 c++ pointers unique-ptr delete-operator

我正在写一个游戏框架,我有一个 vector<unique_ptr<Object>>列表,我通过调用 object.get() 分发该列表中的指针并将其发送出去。在此之前,我发送了引用而不是原始指针,但这导致了其他奇怪的问题,所以我被告知这样更好。但是,当我删除 unique_ptr<Object>从列表中,原始指针仍然存在。我也无法手动解除分配它们,我收到一个异常,提示未分配指针。

所以我的问题是:

  1. 如何从已删除的 unique_ptr 中删除原始指针?

也是一个更普遍的问题:

  1. 在传递指针而不是引用方面,我的结构是否正确?
PxlObject* PxlFramework::AddObject(PxlObject* obj)
{
    std::unique_ptr<PxlObject> u_ptr(obj);
    objects_iterator = objects.insert(objects.end(), std::move(u_ptr));
    return obj;
}

void PxlFramework::DeleteObject(PxlObject* obj) {
    for(objects_iterator = objects.begin(); objects_iterator != objects.end(); ++objects_iterator)
    {
        if((*objects_iterator)->get_id() == obj->get_id())
        {
            //attempting to delete the raw pointer here but it will result in an error
            delete obj;

            //removing the unique_ptr<PxlObject> from the list here
            std::swap((*objects_iterator), objects.back());
            objects.pop_back();
            break;
        }
    }
}

最佳答案

std::unique_ptr 的全部意义在于它“拥有”对象,并且在 unique_ptr 被销毁时自动管理删除。因此,您不应删除unique_ptrunique_ptr 拥有的任何内容。为了避免这种混淆,引用更为常见。此外,奇怪的是,您的 AddObject 返回一个指向 PxlObject 的指针,不是刚添加的对象。

像这样的东西可能更干净一些:

template<class Us...>
PxlObject& PxlFramework::AddObject(Us&&... obj)
{
    std::unique_ptr<PxlObject> u_ptr(new PxlObject(std::forward<Us>(obj)...));
    objects_iterator = objects.insert(objects.end(), std::move(u_ptr));
    return **objects_iterator;
}

void PxlFramework::DeleteObject(PxlObject& obj) {
    auto finder = [](std::unique_ptr<PxlObject>& p)->bool 
            {return obj.get_id()==p->get_id();};
    auto it = find_if(objects.begin(), objects,end(), finder);
    if (it != objects.end())
        objects.erase(it);
    else
        throw ...;
}

关于c++ - 如何从 unique_ptr 中删除原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23895214/

相关文章:

C++ 函数需要 size_t 参数

c++ - 为什么可以从另一个 unique_ptr get() 创建 unique_ptr 而不会导致错误?

c++ - 作为类参数的模板对象在编译前给出错误

c++ - C++中箭头和点运算符在不同情况下的解释

c - 如果用指针引用常量字符串,是否永久占用内存?

实现结构时将指针作为函数参数

c++ - 使用带有 unique_ptr 的 union

c++ - 将这种原始指针情况变成 unique_ptr?

c++ - 如何构建独立的clang可执行文件?

c++ - 如何在 C++ 中获取目录中的文件列表?