0

スマート ポインターを使用して、コースの割り当てのために潜在的に大きなデータ要素を並べ替えて再リンクしようとしています。以下に示すように、コードでスマート ポインターのクラスを定義しました。

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;
};

並べ替えようとしているオブジェクトは、個人的な記録 (名前、電話番号など) を持つクラス オブジェクトを含む単一リンク リストです。以下に示すように、片方向リスト クラスには iterator クラスがあります。

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) への呼び出しがコメントアウトされていることはわかっていますが、スマート ポインターが適切な場所に移動するまで、並べ替えを開始したくありませんでした。

4

0 に答える 0