Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享指针交换方法标识更改_C++_List_Shared Ptr - Fatal编程技术网

C++ 共享指针交换方法标识更改

C++ 共享指针交换方法标识更改,c++,list,shared-ptr,C++,List,Shared Ptr,背景: 我不知道是什么原因让我尝试这个,但我正在尝试测试一个内部使用smartpointers的容器化链表 以下是repl链接: #包括 使用名称空间std; 样板 类链接列表{ 私人: 类节点{ 公众: T数据; 共享下一步; 节点(T数据){ 这->数据=数据; } }; //非常量唯一ptr 共享ptr头; 公众: 无效添加(T数据){ 难道你严重误解了共享指针吗 您最需要的跟踪信息是node::node和node::~node。在实际节点被创建和销毁时进行跟踪将对您有所帮助。您还必须了

背景: 我不知道是什么原因让我尝试这个,但我正在尝试测试一个内部使用smartpointers的容器化链表

以下是repl链接:

#包括
使用名称空间std;
样板
类链接列表{
私人:
类节点{
公众:
T数据;
共享下一步;
节点(T数据){
这->数据=数据;
}
};
//非常量唯一ptr
共享ptr头;
公众:
无效添加(T数据){

难道你严重误解了共享指针吗

您最需要的跟踪信息是node::node和node::~node。在实际节点被创建和销毁时进行跟踪将对您有所帮助。您还必须了解范围

对您的“添加”功能的快速评论(留给您的修复超出了问题的范围,对我发布太多有害):

它可以正确地创建单个项目列表。但是,如果您再次尝试添加,您可以将头移动到临时对象,将头设置为nullptr。然后,您可以在列表中循环游标,销毁可能存在的任何节点,直到不再存在。您刚刚将nullptr指定给游标这一事实不是问题,因为您可以立即oss无论它有什么价值,当你创建一个包含单个项目的新列表时,由游标而不是头持有。然后你离开范围,破坏游标,因此也破坏你刚才添加到游标的新项目

但最大的问题是你的跟踪功能,你用它来理解你的列表,但它并没有做任何你想做的事情。这是最大的问题,因为你认为你了解基于坏信息发生的事情。如果跟踪欺骗了你,那么你就无法用它来理解添加

这是一个跟踪功能,它可以正确打印列表的当前内容,而不会破坏列表:

void trace() {
    cout << "trace: ";
    shared_ptr<node> cursor = head; // SHARE, do not lose head, read the docs
    while (cursor.get()) {
        cout << cursor->data << ", ";
        cursor = cursor->next;
    }
    cout << endl;
}
void trace(){

不能发布内联。你明白“交换”是什么意思吗?(对不起,无意冒犯。)
shared\u ptr cursor;
make
cursor
nullptr
初始化()
cursor.swap(head)
交换
光标
头部
的内容。之后,
光标
具有先前的
头部
头部
值(猜测)
nullptr
以前在
cursor
中。为什么不
cursor=head;
取而代之呢?顺便说一句。这与智能指针的怪癖无关。它也会发生在原始指针上(忽略
node*cursor;
会使
cursor
未初始化的事实,这会使事情变得更糟。)确实尝试了cursor=head;但结果相同,让我进一步调试。thanksit是共享指针作用域问题,跟踪函数现在正常工作。Thanksiling=std::shared_ptr(空)0x0}->sibling=std::shared_ptr(计数1,弱0)0x604460}
void trace() {
    cout << "trace: ";
    shared_ptr<node> cursor = head; // SHARE, do not lose head, read the docs
    while (cursor.get()) {
        cout << cursor->data << ", ";
        cursor = cursor->next;
    }
    cout << endl;
}