我正在尝试使用智能指针对课程分配的潜在大数据元素进行排序和重新链接。我在我的代码中为智能指针定义了一个类,如下所示:
template <typename T>
class sptr {
public:
sptr(T *_ptr=NULL) { ptr = _ptr; }
bool operator<(const sptr &rhs) const {return *ptr < *rhs.ptr;}
operator T * () const { return ptr; }
private:
T *ptr;
};
我尝试排序的对象是包含具有个人记录(即姓名,电话号码等)的类对象的单链表。单链接列表类中包含一个迭代器类,如下所示。
template <class T>
class slist {
private:
struct node {
node() { data=T(); next=NULL; }
bool operator<(const node & rhs) const {return next < rhs.next;}
T data;
node *next;
};
node *head;
node *tail;
int N;
public:
slist();
~slist();
void push_back(const T &);
void sort();
class iterator {
public:
iterator() : p(NULL) {}
T & operator*() { return p->data; }
iterator & operator++() { p = p->next; return *this; }
bool operator!=(const iterator & rhs) const { return p != rhs.p; }
private:
friend class slist<T>;
iterator(node *p) : p(p) {}
node *p;
};
iterator begin() {return iterator(head->next);}
iterator end() {return iterator(NULL);}
};
以下是我的列表类中的函数&#34;排序&#34;使用智能指针。
template <typename T>
void slist<T>::sort(){
vector< sptr<node> > Ap(N); // set up smart point array for list
//slist<T>::iterator iter = begin();
node *ptrtemp = head->next;
sptr<node> sptrtemp = ptrtemp;
for (int i = 0; i < Ap.size() - 1; i++){
if (Ap[i] != NULL){
Ap.push_back(sptrtemp);
ptrtemp = ptrtemp->next;
sptrtemp = ptrtemp;
cout << "Temporary Address: " << sptrtemp << " Vector Element Address: " << Ap[i];
}
}
//sort(Ap.begin(), Ap.end()); // WE GON SORT
ptrtemp = head;
for (int j = 0; j < Ap.size() - 1; j++){ // relink using sorted result
ptrtemp->next = Ap[j];
sptrtemp = ptrtemp;
Ap.push_back(sptrtemp);
}
ptrtemp->next = NULL;
}
tl; dr,我必须在某处编写一个错误的智能指针,因为这个代码会编译,但是当我运行它时,std :: bad_alloc会随着核心转储一起发生。我在哪里泄漏记忆?在此先感谢您的帮助!
P.S。,我已经进一步研究了智能指针here,如果这个实现不是作业的要求,我会使用标准库的智能指针。另外,我知道我对std :: sort(开头,结尾)的调用已被注释掉了,但是我还没有想要开始排序,直到我把智能指针放到正确的位置。