0

リンク リスト クラス テンプレートを作成しようとしています (はい、C++ ライブラリにテンプレートがあることは知っていますが、楽しみのために独自のテンプレートを作成したかったのです)。私はコードをたどりましたが、プログラムが終了するまではすべて問題ないようです。

使用したコードは次のとおりです。

list.h:

#ifndef LIST_H
#define LIST_H

#include "misc.h"

template <typename T> class CList {

private:

  class CNode {

  friend CList;

  private: T data; 
       CNode* next;

  public: CNode() : next(NULL) {}
      ~CNode() { delete [] next; }
  };

private: int length; 
         CNode* first;

public: 

  CList() : length(0), first(NULL) {}

  CList(int i_length) : first(NULL) {

    int i;

    CNode* cur = NULL;
    CNode* prev = NULL;

    if (i_length < 0) length = 0;
    else length = i_length;

    for (i=0;i<length;i++) {

      // allocate new CNode on heap
      cur = new2<CNode>();

      // attach preceding CNode pointer
      if (prev) prev->next = cur;
      else first = cur;

      prev = cur;
    }
  }

  ~CList() { delete first; }

};

その他

#ifndef MISC_H
#define MISC_H

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

inline void terminate( const char* message, int code ) {
  printf("\n\n%s\n\n",message);
  system("pause");
  exit(code);
};

template <typename T> inline T* new2() {
  T* ret = new T;
  if (!ret) terminate("Insufficient Memory",-2);
  return ret;
}

template <typename T> inline T* new2(int num) {
  if (num <= 0) terminate("Invalid Argument",-1);
  T* ret = new T[num];
  if(!ret) terminate("Insufficient Memory",-2);
  return ret;
}


#endif

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "../Misc/misc.h"
#include "../Misc/list.h"

int main(int argc, char* argv[]) {

  //CList<int> m;
  CList<int> n(5);

  system("pause");

  return 0;
}

「return 0;」の直前のブレークポイントで変数「n」がどのように見えるかを次に示します。

http://s20.beta.photobucket.com/user/marshallbs/media/Untitled_zps52497d5d.png.html

エラーが発生するコンテキストは次のとおりです。残念ながら、この時点で、変数 "n" がウォッチ リストに表示されなくなりました。

       _mlock(_HEAP_LOCK);  /* block other threads */
    __TRY

        /* get a pointer to memory block header */
        pHead = pHdr(pUserData);

         /* verify block type */
        _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

リストにデフォルトのコンストラクターを使用してもエラーは発生しません。nullの「次の」ポインターを持つ5番目のCNodeオブジェクトに到達すると、メモリ解放プロセスが停止する必要があるため、何が起こっているのかわかりません。無効な null 以外のポインターを解放しようとしているかのように動作しますが、これがどのように発生するかわかりません。

4

2 に答える 2

0

1 つの問題は、 を使用して割り当てnext、 を使用newして解放することdelete[]です。これは未定義の動作です。

割り当て:

   cur = new2<CNode>(); // new2 uses `new' and not `new[]'

割り当て解除:

  ~CNode() { delete [] next; }

後者を に置き換えdelete next;ます。

于 2013-01-19T20:10:15.887 に答える
0

コードをそのまま (デバッガーから) ビルドして実行しましたが、アサーション エラーは発生しませんでした。実際、CList にはデストラクタがないため、メモリの割り当てがまったく解除されません (完全なコードを投稿していませんか?)。

于 2013-01-19T20:10:34.230 に答える