2

たとえば、intの配列をパラメーターとして持つコンストラクターを持つクラスがあります。

A(int* array) : m_array(array) {}

次のように使用できます。

int array[] = { ... }
A a(array);

またはこのように:

int* array = new int[10];
A a(array);

オブジェクトがその配列を使用する場合、デストラクターでそれを削除する必要があります (または削除しない場合もあります) (動的な場合)。しかし、この配列のメモリが動的に割り当てられたことをどうやって知るのでしょうか?

4

4 に答える 4

2

結局のところ、配列ではなくポインターでint* arrayあるため、動的に割り当てられているかどうかはわかりません。intあなたも渡すかもしれません:

int i;
A a(&i);

ご想像のとおり、それをしようとしたり、N > 0 でdelete[]アクセスしようとすると、悪いことが起こります。m_array[N]

したがって、呼び出し元が正しいことを行うことに依存する必要があります。それを確認または強制するためにできることは何もありません。あなたが持っているのはのアドレスだけですint。誰がそれを作成したかint、またはintその後に がどのように続くかは不明です。

より安全が必要な場合は、 を使用してstd::vectorください。これがそのために作られたものです。

于 2012-11-25T11:11:20.200 に答える
0

コンストラクターで配列を初期化しているため、常に初期化されます。割り当てられることは、コードで事前に定義されています。配列を割り当てない他のコンストラクターがある場合は、このチェックを行う必要があります。

ちなみに、これは割り付けている配列がクラスのメンバであるという前提です。コンストラクター内で新しいスタック変数に割り当てている場合は、デストラクターで削除できません。

于 2012-11-25T11:11:02.863 に答える
0

静的配列もポインターに崩壊するため、それが何であったかを知ることはできません。

基本的に、コンストラクターに渡される配列の値が必要なだけです。それが動的に割り当てられた配列であったか、静的に割り当てられた配列であったかを知る必要はありません。重要なのは、クラスのインターフェイスの一部であり、データをコピーするデータ メンバー配列です。引数としてコンストラクターに渡される配列の責任は、その削除と有効期間に関して呼び出し元にある必要があります。

std::vector生の配列の代わりに使用すると、作業が楽になります。

于 2012-11-25T11:12:21.233 に答える
0

私が理解していることから、あなたが尋ねようとしているのは、デストラクタが配列に割り当てたメモリを解放するかどうかです。

いいえ、 new を使用して割り当てたメモリは、デストラクタで削除するか、ポインタがスコープ内にある別の場所で削除する必要があります。これは、メモリ割り当てがコンストラクタ内ではなく外部であるためです。

于 2012-11-25T11:12:56.257 に答える