0

私はこの構造と動的に割り当てられた配列を持っています。std::vector と std::string は宿題なので使えません。

 struct Moves
    {
        const char* date;
        const char* street;
        const char* city;
    };

struct Data
{
    const char* id;
    const char* name;
    const char* surname;
    int count;
    Moves** moves;

};

クラスがあり、構造体 Data にポインターの配列を作成し、char* の日付、通り、都市を動的に割り当てます。

ここで、これらのメモリ ブロックを削除する必要があります。さて、私はこれを試しました: (私のクラスのデストラクタ) 質問: 割り当てられたすべてのメモリを正しく解放するにはどうすればよいですか?

class Reg
{
private:
 Data** arr;
 int counter;
public:
  Reg(){ arr=new Data*[1000]; }
  ~Reg();
  ... other methods
};

Reg::~Reg()
    {
        for(int i=0;i<counter;i++)
        {
            for(int c=0;c<arr[i]->count;c++)
            {
                delete arr[i]->moves;
            }

            delete arr[i];
        }

        delete [] arr;
    }

割り当ての例を次に示します。

arr[counter]=new Data; 
arr[counter]->id=new char[12];
arr[counter]->id=id;
arr[counter]->name=new char[strlen(name)+1];
arr[counter]->name=name;
arr[counter]->surname=new char[strlen(surname)+1];
arr[counter]->surname=surname;

arr[counter]->moves=new Moves*[100];
arr[counter]->moves[0]=new TMoves;

arr[counter]->moves[0]->city=new char[strlen(city)+1];
arr[counter]->moves[0]->city=city;

arr[counter]->moves[0]->date=new char[strlen(date)+1];
arr[counter]->moves[0]->date=date;

arr[counter]->moves[0]->street=new char[strlen(street)+1];
arr[counter]->moves[0]->street=street;
4

3 に答える 3

0

これはどれくらいいいですか?

struct Moves
{
  std::string date;
  std::string street;
  std::string city;
};

struct Data
{
  Data() { moves.reserve(1000); }
  std::string id;
  std::string name;
  std::string surname;

  typedef std::unique_ptr<Moves> MovesPtr;
  typedef std::vector<MovesPtr> MovesList;
  MovesList moves;
};

これで新しいものを追加できるようMovesになり、それらはオブジェクトの破棄時に解放されDataます。

int main()
{
  Data d;
  d.moves.push_back(Data::MovesPtr(new Moves()));

  return 0;
}    

STL は素晴らしいものであり、役立つものであり、使用する必要があります。

于 2013-04-10T23:38:41.913 に答える