我使用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
}
}
我听说这是一种不好的做法,如果有,那么有人可以告诉我为什么吗?有关正确做法的建议和提示也将受到赞赏。
答案 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
会发生什么?