指针变成unique_ptr后会发生什么



我有一个函数,它创建一个指向动态分配对象的唯一指针"c";。

template<typename T, typename... TArgs> void addComponent(TArgs&&... MArgs) {
if(!components.count(typeid(T))) {
T* c = new T(std::forward<TArgs>(MArgs)...);
c->entity = this;
std::unique_ptr<Component> uPtr{ c };
components[typeid(T)] = (std::move(uPtr));
c->init();
}
}

我的理解是,unique_ptr控制了c的值,因为你不能让另一个指针指向一个unique_pr,但是c->在c变成unique_ptr之后,init仍然可以工作。

为什么这样做?c是否仍然指向相同的新T((,或者是创建了一个全新的对象?

unique_ptr对象存储c值的副本。当unique_ptr对象被销毁时,其析构函数将对存储的指针值调用delete

原始变量c不会被unique_ptr修改,而是继续指向同一对象。取消引用它是完全可以的。重要的是,由于这个指针值将被unique_ptr自动删除,(1(在unique_ptr的生存期到期后,您不能继续使用它的值,(2(您不能尝试手动删除它。

将原始指针封装在智能指针内部不会更改原始指针的任何内容。它仍然指向它最初指向的同一内存。智能指针只是复制指针,然后为您管理指向的内存,当智能指针被销毁或以其他方式分配了不同的指针时,delete会占用内存。

仅供参考,使用std::make_unique()而不是new会更安全、更高效,例如:

template<typename T, typename... TArgs>
void addComponent(TArgs&&... MArgs) {
if (!components.count(typeid(T))) {
auto c = std::make_unique<T>(std::forward<TArgs>(MArgs)...);
c->entity = this;
c->init();
components[typeid(T)] = std::move(c);
}
}

不会创建新对象,也不会有任何东西控制任何东西。您用智能指针包装了原始指针,不应该再使用原始指针了。

只有当你不使用原始指针来处理智能指针时,智能指针才能工作。但变量c的值并没有因为std::unique_ptr构造函数中的赋值运算符而改变。它保持不变,作为程序员,你应该遵守纪律,不再直接使用它。

好的做法是将其作为一个临时变量,在将其封装到智能指针中后消失;或者仅仅使用CCD_ 15来代替CCD_。

相关内容

  • 没有找到相关文章

最新更新