Typecasting指向unique_ptr的正常指针是一种不好的做法吗?

时间:2015-05-21 10:11:43

标签: c++ c++11

我使用unique_ptr混合了普通指针实现了一个单链表。

我有这段代码:

template<typename B>
void linkedlist<B>::addNode(B x){
  node * n = new node;                      //initialize new node
  n->x = x;
  n->next = nullptr;                        //smart pointer

  if(head == nullptr){                      //if the list is empty
    head = (unique_ptr<node>)n;             //cast the normal pointer to a unique pointer

  }else{                                    //if there is an existing link
    current = head.get();                   //get the address that is being
                                            //pointed by the unique_ptr head


    while(current->next != nullptr)         //loop until the end then stop
      current = (current->next).get();

    current->next = (unique_ptr<node>) n;   //connect the new node to the  last node
  }
}

我听说这是一种不好的做法,如果有,那么有人可以告诉我为什么吗?有关正确做法的建议和提示也将受到赞赏。

2 个答案:

答案 0 :(得分:5)

虽然演员语法有点奇怪,但它与更传统的

完全相同
unique_ptr<node>(n)

所以不是不好的做法。什么是不好的做法是让原始指针悬而未决,如果有一个代码路径没有删除它或将其转移到智能指针,它可能会泄漏。

你应该从

开始
unique_ptr<node> n(new node);

通过移动来转移所有权

head = std::move(n);

答案 1 :(得分:0)

在你的情况下,它可能不是一个问题,但是将现有的原始指针强制转换为unique_ptrs是一种不好的做法,主要是由于涉及语义。当超出范围时,Unique_ptr将运行删除器。

考虑以下

int ptr_method(int * i) {
    auto a = (unique_ptr<int>)i;
    return *a.get();
}

int main() {
    int i = 10;
    ptr_method(&i);
}

i返回时ptr_method会发生什么?