タスククラスの例外
Posted: 2011年3月30日(水) 23:53
ここでまた質問させていただきます。
こんな感じでみようみまねで作ってみたのですが、どうも例外が発生してしまってうまくいきません
ずっと考えているのですが、結局わかりませんでした。
誰か教えていただけるとありがたいです。よろしくお願いします。
開発環境
Windows XP
Visual C++ 2008
// Task.cpp
#include "Task.h"
#include <stdio.h>
#include <assert.h>
//=============================================================
// タスクリストの初期化
CTaskList::CTaskList(int max_task_size, int max_num_task)
: MaxTaskSize(max_task_size), MaxNumTask(max_num_task),
NumFreeTask(max_num_task)
{
// タスク初期化用のマクロ
#define TASK(INDEX) ((CTask*)(buf+max_task_size*(INDEX)))
// タスク用メモリの確保
char* buf=new char[max_task_size*(max_num_task+2)];
// アクティブタスクリストの初期化
ActiveTask=TASK(0);
ActiveTask->Prev=ActiveTask->Next=ActiveTask;
// フリータスクリストの初期化
FreeTask=TASK(1);
for (int i=1; i<max_num_task+1; i++) {
TASK(i)->Next=TASK(i+1);
}
TASK(max_num_task+1)->Next=FreeTask;
}
//=============================================================
// タスクの生成
// フリータスクリスト上では、メモリブロックの先頭にCTaskを配置する。
// サブクラスのコンストラクタを呼び出した後には、
// メモリブロックの先頭にCTaskが配置されるとは限らない(多重継承など)
// そこで、生成処理をnewとコンストラクタに分割する。
// 削除処理も同様にデストラクタとdeleteに分割する。
// newの処理
void* CTask::operator_new(size_t t, CTaskList* task_list) {
// クラスサイズが最大サイズを超えたらエラー
assert(t<=(size_t)task_list->MaxTaskSize);
// フリータスクがないときはNULLを返す
if (task_list->NumFreeTask<=0) return NULL;
// フリータスクを1個取り出す
CTask* task=task_list->FreeTask->Next;
task_list->FreeTask->Next=task->Next;
task_list->NumFreeTask--;
// コンストラクタへ
return task;
}
// コンストラクタ
CTask::CTask(CTaskList* task_list)
: TaskList(task_list)
{
// タスクをアクティブタスクリストに挿入する
Prev=task_list->ActiveTask->Prev;
Next=task_list->ActiveTask;
Prev->Next=Next->Prev=this;
}
//=============================================================
// タスクの削除
// デストラクタ
CTask::~CTask() {
// タスクをアクティブタスクリストから削除する
Prev->Next=Next;
Next->Prev=Prev;
}
// deleteの処理
void CTask::operator_delete(void* p, CTaskList* task_list) {
// タスク
CTask* task=(CTask*)p;
// タスクをフリータスクリストに挿入する
task->Next=task_list->FreeTask->Next;
task_list->FreeTask->Next=task;
task_list->NumFreeTask++;
// フリータスク数が最大タスク数を超えたらエラー
// (deleteの重複呼び出しなど)
assert(task_list->NumFreeTask<=task_list->MaxNumTask);
}
//=============================================================
// 全タスクの消去
void CTaskList::DeleteTask() {
for (CTaskIter i(this); i.HasNext(); i.Next(), i.Remove()) ;
}
// Task.h
#ifndef TASKH
#define TASKH
class CTask;
class CTaskList;
class CTaskIter;
//==============================================================
// タスク
class CTask {
friend CTaskList;
friend CTaskIter;
// タスクリストへのポインタ
CTaskList* TaskList;
// 前後のタスクへのポインタ
CTask *Prev, *Next;
// タスクリストを指定しないnew, deleteを無効にする
void* operator new(size_t t) {}
void operator delete(void* p) {}
protected:
// new, deleteの処理:
// 適切なnew, delete演算子をサブクラスで定義する
static void* operator_new(size_t t, CTaskList* task_list);
static void operator_delete(void* p, CTaskList* task_list);
public:
CTask(CTaskList* task_list);
virtual ~CTask();
};
//==============================================================
// タスクリスト
class CTaskList {
friend CTask;
friend CTaskIter;
// アクティブタスクリスト、フリータスクリスト
CTask *ActiveTask, *FreeTask;
// タスクの最大サイズ、タスクの最大数
int MaxTaskSize, MaxNumTask;
// フリータスクの数
int NumFreeTask;
public:
// コンストラクタ
CTaskList(int max_task_size, int max_num_task);
// タスクの数
int GetNumFreeTask() { return NumFreeTask; }
int GetNumActiveTask() { return MaxNumTask-NumFreeTask; }
// 全タスクの消去
void DeleteTask();
};
//==============================================================
// タスクイテレータ
class CTaskIter {
protected:
CTaskList* TaskList;
CTask* Task;
public:
// コンストラクタ
inline CTaskIter(CTaskList* task_list)
: TaskList(task_list), Task(task_list->ActiveTask)
{}
// 次の要素があるときtrue
inline bool HasNext() {
return Task->Next!=TaskList->ActiveTask;
}
// 次の要素を返す
inline CTask* Next() {
return Task=Task->Next;
}
// 直前に返した要素を削除する
inline void Remove() {
Task=Task->Prev;
delete Task->Next;
}
};
#endif
こんな感じでみようみまねで作ってみたのですが、どうも例外が発生してしまってうまくいきません
ずっと考えているのですが、結局わかりませんでした。
誰か教えていただけるとありがたいです。よろしくお願いします。
開発環境
Windows XP
Visual C++ 2008