リンク リスト クラス テンプレートを作成しようとしています (はい、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 以外のポインターを解放しようとしているかのように動作しますが、これがどのように発生するかわかりません。