我正在写一个游戏框架,我有一个 vector<unique_ptr<Object>>
列表,我通过调用 object.get()
分发该列表中的指针并将其发送出去。在此之前,我发送了引用而不是原始指针,但这导致了其他奇怪的问题,所以我被告知这样更好。但是,当我删除 unique_ptr<Object>
从列表中,原始指针仍然存在。我也无法手动解除分配它们,我收到一个异常,提示未分配指针。
所以我的问题是:
- 如何从已删除的 unique_ptr 中删除原始指针?
也是一个更普遍的问题:
- 在传递指针而不是引用方面,我的结构是否正确?
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_ptr
或unique_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/