C++ std::智能指针的错误分配问题
我试图使用智能指针对课程作业中潜在的大型数据元素进行排序和重新链接。我在代码中为智能指针定义了一个类,如下所示:C++ std::智能指针的错误分配问题,c++,sorting,pointers,smart-pointers,bad-alloc,C++,Sorting,Pointers,Smart Pointers,Bad Alloc,我试图使用智能指针对课程作业中潜在的大型数据元素进行排序和重新链接。我在代码中为智能指针定义了一个类,如下所示: template <typename T> class sptr { public: sptr(T *_ptr=NULL) { ptr = _ptr; } bool operator<(const sptr &rhs) const {return *ptr < *rhs.ptr;} operato
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;
};
模板
sptr类{
公众:
sptr(T*ptr=NULL){ptr=ptr;}
bool运算符您必须自己制作智能指针吗?您不能使用例如or?(或它们的Boost对应项)您拥有的不是真正的智能指针类,因为它实际上不是在管理内存(至少不是在您展示的代码中);它只是持有指针。智能指针类必须正确处理内存管理(这就是他们存在的全部目的)。此外,在这段代码中,您根本没有显示任何分配,这使得任何人都无法告诉您帮助您诊断您的问题。不,我们的教授希望我们使用“sptr”他在讲座中定义的智能指针类,就像在第一篇文章中一样。它使事情更加复杂,但这是我必须使用的东西。我想它没有做到这一点,Zac。我也不知道它在哪里管理内存。那么,我如何让这个实现保持内存,并在排序之前和之后正确链接我的所有元素?如果我没有完全弄错的话,您应该在整个列表中存储sptr
,而不是在排序时将它们包装起来。
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;
}