ファンキーなタイトルですが、正直なところ、これ以上の人物は思いつきませんでした。申し訳ありません :(
ポインターを試しているときに、これに遭遇したので、理解するのに助けが必要です。基本的に、オブジェクトへのポインターのベクトルを作成します。ベクター内のポインターを削除すると、元のオブジェクトも削除されると思います。それらはまったく同じですよね?
動的に割り当てられた配列を作成し、配列の要素の半分へのポインターをポインターのベクトルに入れます。クラス testDestructor のすべてのオブジェクトが作成された「順序」を認識する方法の各ステップでは、静的整数を介して増分番号がすべて割り当てられます。
次に、ベクトル内のすべてのポインターを pop_back して削除します。ベクトルクラスによって削除されるかどうかを確認したかったので pop_back のみを使用しますが、明らかにそうではありませんが、そこに何かが欠けている場合はidkします。重要なのは、削除することです。
さて、私が期待しているのは、これにより配列の対応する要素も削除されることです。ベクトルと配列要素がメモリ内の同じ場所を指しているため、これが起こるべきです。つまり、デストラクタを呼び出す必要があります。
そのため、配列を削除すると、5 つの要素のみが削除されるか、実行時エラーが発生することが予想されます (既に削除されているポインターを削除しようとしたときに、以前にこの問題が発生したことがありますが、別のシナリオ idk)。つまり、デストラクタだけが 5 回しか呼び出されないことを期待しています。
しかし、それは起こりません。コンストラクタは 10 回呼び出されますが、デストラクタは 15 回呼び出されます。私は何が欠けていますか?コンストラクターがありませんか (デフォルト コンストラクターとコピー コンストラクターについてしか知りませんが、他にもあります)、それとも何か他のものですか? 私の考えでは、デストラクタがなくなるとオブジェクトがなくなるからです。
コードが多すぎる場合は申し訳ありません:
testDestructor.h:
#ifndef TESTDESTRUCTOR_H
#define TESTDESTRUCTOR_H
class testDestructor
{
public:
testDestructor();
testDestructor(const testDestructor &);
~testDestructor();
static int maxTest;
int test;
};
#endif
testDestructor.cpp:
#include "testDestructor.h"
#include <iostream>
using namespace std;
int testDestructor::maxTest = 0;
testDestructor::testDestructor()
{
test = maxTest++;
cout << "testDestructor nr " << test << " created successfully\n";
}
testDestructor::testDestructor(const testDestructor &destructorToCopy)
{
test = maxTest++;
cout<< "testDestructor nr " << test << " created successfully (using the copy constructor\n";
}
testDestructor::~testDestructor()
{
//maxTest--;
cout << "testDestructor " << test << " destroyed successfully\n";
}
main.cpp:
#include <iostream>
#include "testDestructor.h"
#include <vector>
using namespace std;
int main()
{
cout << " creating pointer array:\n\n";
testDestructor *testPtr = new testDestructor[10];
cout << " intitiating vector\n\n";
vector<testDestructor*> testVct;
for (int i = 0; i < 5; i++)
{
cout << " pushing back vector " << i << ":\n";
testVct.push_back(testPtr + i);
cout << "testDestructor " << testVct[i]->test << " pushed back\n";
}
cout << "\n";
for (int i = 4; i >= 0; i--)
{
cout << " popping back vector " << i << ":\n";
cout << "testDestructor " << testVct[i]->test << " popped back\n";
delete testVct[i];
testVct.pop_back();
}
cout << "\n";
cout << " deleting pointer array\n\n";
delete [] testPtr;
}