我查看了一些使用原始指针的旧代码,并将其更改为unique_ptr
。现在,当我尝试编译代码时,我收到此错误消息:
错误1错误C2280:' std :: unique_ptr> :: unique_ptr(const std :: unique_ptr< _Ty,std :: default_delete< _Ty>>&)' :尝试引用已删除的函数d:\ visual studio 2013 \ vc \ include \ xmemory0
关于这种情况的编译器输出很大 - 为了节省这个问题的空间,请看here。
据我所知,它与我使用唯一指针的方式有关。它从这里开始(level.h,第65-66行):
typedef std::unique_ptr<Enemy> PEnemy;
std::list<PEnemy> m_enemies;
现在,我在编译器输出中得到的下一个线索是baseource.cpp中的第47行:
std::list<PEnemy> enemies = Game::LEVEL->getEnemies();
为什么这会导致问题?我该如何修复错误?
答案 0 :(得分:17)
unique_ptr
s无法复制;只感动!但由于std::list
应该能够在内部移动它们,因此您唯一的问题应该是您对列表本身执行的分配。
你可以移动列表吗?
std::list<PEnemy> enemies = std::move(Game::LEVEL->getEnemies());
或者使用对它的引用?
const std::list<PEnemy>& enemies = Game::LEVEL->getEnemies();
如果不是(并且它将取决于Game::LEVEL->getEnemies()
的返回类型,您可以使用上述解决方案中的哪一个),那么您需要深入,深入将或复制到shared_ptr
。
这一切似乎都是一种障碍,但它实际上是通过严格执行有关你所有人的所有权的规则来帮助你。