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