gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:04:09 25 4
gpt4 key购买 nike

我正在写一个游戏框架,我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com