我目前正在考虑在unique_ptrs的帮助下实现单个链表.尽管由于析构函数的递归调用可能导致堆栈溢出的问题(请参阅Stack overflow with unique_ptr链表),但我遇到了以下问题:假设,我们有以下链表实现
struct node {
node (void) : val(0), next(nullptr) {}
int val;
std::unique_ptr<node> next;
};
Run Code Online (Sandbox Code Playgroud)
我们已经按照初步确定了我们的清单
int main (int argc, char* argv[]) {
node HEAD;
HEAD.val = 0;
auto ptr = &HEAD;
for (int i = 0; i < 10; ++i) {
ptr->val = i;
ptr->next.reset(new node);
ptr = ptr->next.get();
}
ptr->val = 10;
...
Run Code Online (Sandbox Code Playgroud)
现在,我想删除值为1的节点:
ptr = &HEAD;
ptr = ptr->next.get();
HEAD.next = std::move(ptr->next);
Run Code Online (Sandbox Code Playgroud)
乍一看,这似乎是明智的.不过,我不确定它是否会导致未定义的行为:
根据http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D,运营商=
将所有权从r转移到*这就好像通过调用reset(r.release())然后从std :: forward(r.get_deleter())分配get_deleter()一样
仔细看看unique_ptr :: reset( …