2

このクラスを取得して、すべての派生オブジェクトのリストを取得しました

Register.h
-----------------
class Register {
...
public:

// static object list
static list<Register*> instances;

// default constructor for register object
Register::Register();

// virtual destructor to clean up with subobject destructor first
virtual Register::~Register();

// default methods for this class
static void Register::stop();

Register.cpp
-----------------
#include "Register.h"

// list with all object instances made by this programm
list<Register*> Register::instances;

// default destructor
Register::~Register() {
  list<Register*>::iterator p = find(instances.begin(), instances.end(), this);
  if (p != instances.end()) {
    instances.erase(p);
  }
}

// erase all instances clean up the dish
void Register::stop() {
  // last log message
  Log::write("register cleanup");
  // stops the logging object
  Log::stop();
  // clean up instances
  list<Register*>::iterator iter = instances.begin();
  list<Register*>::iterator end  = instances.end();
  while (iter != end) {
    cout<< endl << (*iter) -> typeName << endl;
    //delete *iter;
  }
  Register::instances.clear();
}

および派生クラス

File.h
-----------------
class File : public Register {
...
// default destructor
virtual File::~File(void);
...
}

File.cpp
-----------------
// default destructor
File::~File(void) {
  cout << "file destr";
  this -> deleteFile();
}

Log.h
-----------------
// this class implements a log handler
// (derived from register)
class Log : public File {

public:
  // singelton logging object
  static Log* log;

  // default destructor
  Log::~Log(void);

Log.cpp
-----------------
using namespace std;

// declare pointer for easy logging
Log* Log::log = NULL;

// default destructor
Log::~Log(void) {
cout << "log destr";
}

リストとその中のオブジェクトを削除するだけで、構造全体を削除したいと思います。

私はで試しました

 Main.cpp
-----------------
 int main (int argc, char *argv[], char *envp[]) {

   Register::stop();

   return 1;
 }

しかし、オブジェクトはまだインスタンス化されています

私はアイデアがありません^^

親切に..

4

3 に答える 3

3

Register :: instances.clear();

これにより、ポインタのリストがクリアされますが、オブジェクトには何もしません。リストをクリアする前に、自分で削除する必要があります。たとえば、次のようになります。

for (list<Register *>::iterator it = Register::instances.begin();
     it != Register::instances.end();
     ++it) {
    delete *it;
}
Register::instances.clear();
于 2012-08-15T14:30:00.493 に答える
2

リストを手動でクリアする代わりに、C++11はSTLコンテナーと互換性のあるstd::unique_ptr<>スマートポインターを導入しました。

static std::list<std::unique_ptr<Register>> instances;

基本的にオブジェクトの削除を処理します。

于 2012-08-15T14:37:46.007 に答える
0

わかりました..私はそれを解決しました..

// clean up instances
list<Register*>::iterator iter = instances.begin();
list<Register*>::iterator end  = instances.end();

while (iter != end) {
  iter = instances.erase(iter);
}
Register::instances.clear();
于 2012-08-15T15:34:05.167 に答える