我正在尝试使用智能指针对课程作业的潜在大数据元素进行排序和重新链接。我在代码中为智能指针定义了一个类,如下所示:
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);}
};
以下是我在列表类中使用智能指针“排序”的函数。
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 与核心转储一起发生。我在哪里泄漏内存?在此先感谢您的帮助!
PS,我已经在这里进一步研究了智能指针,如果这个实现不是分配的要求,我只会使用标准库的智能指针。另外,我知道我对 std::sort(begin, end) 的调用已被注释掉,但我不想开始排序,直到我将智能指针放在正确的位置。