이중 연결리스트 (대학 과제)에서 스마트 포인터를 구현하려고합니다. 그 전에 순수한 C에서 원시 포인터를 사용하여 동일한 작업을 수행했습니다. addNode()에 의해 List에 새 노드를 추가 할 때 두 번 이상 충돌이 발생합니다 (CodeLite (g ++), Windows 10 64 비트 사용). 문제는 내 메모리 관리 (노드 및 목록의 소멸자)라고 가정합니다. 그러나 나는 그것을 해결할 충분한 자격이 없다고 느낍니다. 그래서 어떤 도움을 주시면 감사하겠습니다.이중 연결리스트의 스마트 포인터
#include <stdlib.h>
#include <iostream>
#include <memory>
using namespace std;
template <typename T>
struct Node {
T Value;
weak_ptr<Node<T>> prev;
shared_ptr<Node<T>> next;
~Node() {
while (next){
prev = next->next;
next.reset();
next = prev.lock();
}
}
};
template<typename T>
class List
{public:
shared_ptr<Node<T>> start;
weak_ptr<Node<T>> end;
int size;
public:
List(): size(0){};
~List();
void addNode (T value);
};
template <typename T> List<T>::~List()
{
cout<<"List destructor"<<endl;
while (start){
auto sp = end.lock();
end = start->next;
start.reset(sp.get());
}
}
template <typename T> void List<T>::addNode(T value){
Node<T>* nd = new Node<T>;
if (size==0){
start.reset(nd);
start->Value = value;
end = start;
}
else{
auto sp = end.lock();
auto sp2 = end.lock();
sp->next.reset(nd);
sp.reset(sp->next.get());
sp->prev = sp2;
sp->Value = value;
cout<<"Value size is "<<size<<" "<<sp->Value<<endl;
end = sp;
}
size++;
return;
}
int main()
{
system("CLS");
string a;
string b;
string c;
a = "1 test";
b = "2 test";
c = "3 test";
List<string> ls;
ls.addNode(a);
ls.addNode(b);
ls.addNode(c);
return 0;
}
여기에'shared_ptr' 필요하지 않습니다. 'unique_ptr'은 스마트 포인터를 원한다면 작업 도구입니다. – bolov
이것은 무엇입니까? 'start.reset (sp.get());'와'sp.reset (sp-> next.get());'이것은 똑똑한 포인터를 다루는 완전히 잘못된 방법이다. – Slava
@Slava 각각에 대해 오직 하나의 소유자가있다. 마디. 첫 번째 노드의 List 객체와 나머지 노드의 이전 노드입니다. Ergo'unique_ptr'이 사용되어야합니다. – bolov