#include <QtCore/QStringList>
#include <QtCore/QList>

#define DATA_OBJECTCOUNT  100000
#define DATA_LISTLENGTH   16
#define DATA_STRINGLENGTH 16

// Class containing a QStringList
class MyData
{
  private:
    QStringList myList;
  public:
    static int instances;

    MyData(const QStringList& aList)
      : myList(aList)
    {
      instances++;
    }

    virtual ~MyData()
    {
      instances--;
    }
};

int MyData::instances = 0;

// Class containing MyData objects
class MyDataContainer
{
  private:
    QList<MyData*> myList;
  public:
    virtual ~MyDataContainer()
    {
      // Delete MyData objects
      for(int i = 0; i < myList.count(); ++i)
        if(myList[i] != NULL) delete myList[i];
      myList.clear();
    }

    // append MyData to list and take ownership of the Data pointer
    void addData(MyData* d)
    {
      myList.append(d);
    }
};

int main(void)
{
  printf("Press any key to start.\n");
  getchar();

  MyDataContainer *pContainer = new MyDataContainer;
  for(unsigned int i = 0; i < DATA_OBJECTCOUNT; ++i)
  {
    QStringList dataList;
    for(unsigned int j = 0; j < DATA_LISTLENGTH; ++j)
    {
      QString aString;
      for(unsigned int k = 0; k < DATA_STRINGLENGTH; ++k)
      {
        aString.append(QChar(qrand()%256));
      }
      dataList.append(aString);
    }
    MyData* pData = new MyData(dataList);
    //delete pData;
    //pData = NULL;
    pContainer->addData(pData);
  }

  printf("Created %d data objects.\n", MyData::instances);
  printf("Press any key to delete all allocated objects.\n");
  getchar();

  delete pContainer;
  pContainer = NULL;

  printf("There are %d data objects now.\n", MyData::instances);
  printf("Press any key to exit.\n");
  getchar();

  return 0;
}

