プライベート変数を宣言しました
vector<SomeClass> theVector;
私の SomeClass クラス内のどこかに。
delete theVector
SomeClass デストラクタ内で言えないのはなぜですか?
コンパイラエラーは次のように述べています:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
予想されるポインターは何ですか?
プライベート変数を宣言しました
vector<SomeClass> theVector;
私の SomeClass クラス内のどこかに。
delete theVector
SomeClass デストラクタ内で言えないのはなぜですか?
コンパイラエラーは次のように述べています:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
予想されるポインターは何ですか?
新規と削除の場合は、手をつないで行ってください。
何かを削除するには、new を介して作成する必要があります (ポインタが表示されます)。その後、ポインタを削除できます。ベクターを宣言する方法は、スタック (ヒープではなく) で作成され、スコープ外になると割り当てが解除されます。
int main()
{
vector<SomeClass> theVector;
vector<SomeClass>* ptrVctor = new vector<SomeClass>();
delete ptrVctor; // ptrVctor must be deleted manually
// theVector destroyed automatically here
}
C++ では (Java とは異なり)、スタックまたはヒープのいずれかにオブジェクトを作成できます。あなたが行ったように、スタック上に作成する例は次のとおりです。
vector<SomeClass> theVector;
このオブジェクトは、スタック フレームが消えると (通常は、オブジェクトを作成した関数から戻ったときに) 範囲外になります。
ヒープ上にオブジェクトを作成すると、オブジェクトを作成した関数よりも長く存続できます。これを行うには、次を実行します。
vector<SomeClass> *theVectorPtr = new vector<SomeClass>();
次に、theVectorPtr
ポインターを関数の呼び出し元に戻すことができます (または、必要に応じてグローバルに保存します)。
ヒープ上のオブジェクトを取り除くには、明示的に削除します。
delete theVectorPtr;
コードのどこかに。
ヒープ上のオブジェクトを削除すると、そのオブジェクトのスコープが終了します。関数から戻るのと同じ方法で、スタック上に作成された変数のスコープが終了します。
オブジェクト (値ではなく) がクラス メンバー変数として定義されている場合、そのストレージは常にそのクラスのオブジェクト インスタンスに関連付けられます。
したがって、それを含むオブジェクトがスタックに割り当てられている場合、そのオブジェクトとフィールドは、スタックがアンロールされるときに消滅します。
含まれているオブジェクトがヒープに割り当てられている場合、含まれているオブジェクト全体が削除で終了すると、フィールド オブジェクトが終了します。
それがポインタである場合にのみ、フィールドに削除を適用します。これは、それを含むオブジェクトと共に格納されているものはすべて他のメモリ領域のアドレスであり、その領域内のマテリアルを削除しているためです。
TheVector のメモリは、SomeClass オブジェクトに割り当てられたメモリの一部であるため、SomeClass オブジェクト全体を削除せずに削除することはできません。SomeClass オブジェクトが破棄されると、theVector のメモリは自動的に解放されます。
ベクターに保持されているすべてのオブジェクトを破棄するには、次のようにします。
theVector.resize(0);
これは、ベクトルが範囲外になると自動的に発生します。
これは、theVector がポインタではないためです。つまり、delete' expects. "Expected pointer" means the operand of
delete はポインタでなければなりません。
これと比較して
int theInt;
delete theInt;
あなたが得たものと同様のエラーが確実に生成されます。
c++ は、スタックとヒープでオブジェクトを作成する柔軟性を提供します。以下に示すように、オブジェクトが new 演算子によってヒープに作成されると、ヒープ内のオブジェクトへのポインターが返されます。
ClassA * pobj_class = new ClassA();
スタックで作成されたオブジェクトの場合、コンストラクターは、以下に示すようにポインターではなくオブジェクトを返します。
ClassA obj_class();
変数(obj_class)がスコープ外になると、スタックオブジェクトは自動的に破棄されますが、ヒープ上に作成されたオブジェクトは永遠に存続します。そのため、ヒープオブジェクトを破棄するには、c++ を使用して、ポインタを引数として取り、ポインタが指しているオブジェクトを破棄する削除演算子を提供します。