std::unique_ptr是持有CCell对象还是持有CCell对象指针?
问题解答
关于std::unique_ptr<CCell>的本质
std::unique_ptr<CCell>不是持有CCell对象本身,它内部存储的是指向堆上CCell对象的原始指针(也就是你用new CCell创建的pGroupCell)。作为独占式智能指针,它的核心作用是接管原始指针的所有权,在自身生命周期结束时自动调用delete释放指针指向的堆内存,避免内存泄漏。
你的代码存在的关键问题
当前代码里的AddCellToGrid(apGroupCell)无法编译通过,因为std::unique_ptr的拷贝构造函数被显式禁用——它是独占所有权的智能指针,不允许直接拷贝传递,否则会破坏“同一时间只有一个智能指针管理对象”的语义。
要实现将所有权转移给AddCellToGrid函数的意图,必须用std::move触发所有权转移:
if (FAILED(AddCellToGrid(std::move(apGroupCell)))) return E_FAIL;
调用std::move后,原apGroupCell会变为空(内部指针为nullptr),所有权完全转移到AddCellToGrid的函数参数中。之后当函数参数的unique_ptr生命周期结束时,就会自动释放对应的CCell对象。
额外补充说明
- 你代码里的
if (!apGroupCell)判断是有效的,std::unique_ptr重载了operator bool(),当内部指针为nullptr时会返回false,可以用来检查智能指针是否成功接管了有效的堆对象。 - 完全不需要使用
std::unique_ptr<CCell*>,这种是指向指针的智能指针,和你管理CCell对象内存的需求完全不匹配。
内容的提问来源于stack exchange,提问作者ROBERT RICHARDSON
相关产品推荐
相关产品推荐

