9

int ポインターとベクター ポインターの適切な破棄についていくつか簡単な質問をしたいと思います。まず、私は過去に人々がこの種の問題について尋ねるのを見たことがあります。ほとんどの場合、C++ でベクトル ポインター、オブジェクトへのポインターなどを使用することは、標準的な C++ コーディングの実践として適切ではなく、オブジェクトのコピー。それは本当かもしれませんが、到着前に敷設されたパラダイムを常に制御できるとは限りません。私が取り組む必要があるパラダイムでは、ほとんどすべてへのポインタを初期化する必要があります。C++ への非常に Java に似たアプローチ。これを行う主な理由の 1 つは、データ セットが非常に大きいため、スタック割り当てがオーバーフローしやすいためです。

私の質問:

int32_t 配列へのポインタがある場合、デストラクタでそれを破棄する適切な方法は何ですか?

注: 私たちの慣行は、コンストラクターで NULL へのポインターを設定することです。

I initialize it as a member variable. 
int32_t *myArray_;

When I use it in a method, I would:
this->myArray = new int32_t[50];

To delete it in the method I would call delete on the array:
delete [] this->myArray;

What is the proper call in the destructor?
~MyDestructor(){

    delete this->myArray_;
    or delete [] this->myArray_;

}

ベクトルポインターについて同じ質問があります。

I initialize it as a member variable. 
std::vector<MyObject*> *myVector_;

When I use it in a method, I would:
this->myVector_ = new std::vector<MyObject*>();


//pushback some objects

To delete the vector in the method I would iterate the vector and delete its objects, then    delete the vector;

 for(std::vector<MyObject*>::iterator itr = this->myVector_->begin(); 
 its != this->myVector->end(); ++ itr){

      delete (*itr);

}

delete this->myVector_;


What would be the proper way to clean it up in the destructor?
would I just delete the vector?

delete this->myVector;

or do I need to iterate the entire vector again?

アドバイスをよろしくお願いします。

4

1 に答える 1

15

で割り当てられたものnewは、 で割り当てを解除する必要がありますdelete

int* p = new int;
delete p;

で割り当てられたものnew []は、 で割り当てを解除する必要がありますdelete []

int* p = new int[10];
delete [] p;

に動的に割り当てられて保存されるvectorものはすべて、手動で割り当てを解除する必要があります。

std::vector<int*> v;
v.push_back(new int(1));
v.push_back(new int(2));

for(std::vector<int*>::iterator i = v.begin(), e = v.end(); i != e; ++i)
   delete (*i);

奇妙な理由で、 を動的に割り当てることが適切であると感じた場合vector、同じ規則が適用されます。

std::vector<int*>* v = new std::vector<int*>;
v->push_back(new int(1));
v->push_back(new int(2));

for(std::vector<int*>::iterator i = v->begin(), e = v->end(); i != v; ++i)
   delete (*i);

delete v;

しかし、a を動的に割り当てる理由std::vectorはほとんどないことをお勧めします。

C++11 では、これを行う最善の方法は次のstd::unique_ptrとおりです。

std::unique_ptr<int> p(new int);
// std::unique_ptr handles clean up for you


std::unique_ptr<int[]> p(new int[10]);
// std::unique_ptr handles clean up for you for arrays too!

クラスのメンバー変数がある場合、同じ規則が適用されます。

class Foo
{
   Foo()
      : bar_(new int)
      , bar2_(new int[20])
   {
   }

   ~Foo()
   {
      delete [] bar2_;
      delete bar_;
   }

   int* bar_;
   int* bar2_;
};

しかし、それでも、それらを として持つ方が理にかなっていますstd::unique_ptr。必要に応じて、インターフェイスで生のポインターとして扱うこともできます。

class Foo
{
   Foo()
     : bar_(new int)
     , bar2_(new int[20])
   {
   }

   int* get_bar()
   {
      return bar_.get();
   }

   int* get_bar2()
   {
      return bar2_.get();
   }

   std::unique_ptr<int> bar_;
   std::unique_ptr<int[]> bar2_;
};
于 2012-12-12T17:15:52.827 に答える