2009-06-22 8 views
4

ポインタがC++で配列を指しているかどうかを検出する方法はありますか?私の問題は、配列の所有者になるクラスを実装したいということです。私のクラスはポインタで初期化されており、ポインタが本当に配列ポインタであるかどうかを知りたいと思います。ここで簡略化されたコードは次のとおりポインタが配列を指しているかどうかを検出する方法はありますか?

class ArrayOwner { 
public: 
    explicit ArrayOwner(int* initialArray) : _ptrToArray(initialArray) {} 
    virtual ~ArrayOwner() { delete [] _ptrToArray; } 
private: 
    int* _ptrToArray; 
} 
  • この使用はOKであろう:ArrayOwner FOO(新しいINT [10])。
  • ただし、この使用法 は、未定義の動作につながります。 ArrayOwner foo(new int());

"initialArray"ポインタが実際には配列ポインタであることをコンストラクタでassertを追加したいと思います。コンストラクタの契約を変更することはできません。ベクターを使用します。 C++でこのアサーションを書く方法はありますか?

+0

代わりに、Boost Array(http://www.boost.org/doc/libs/1_39_0/doc/html/array.html)のようなものを使用できるかどうかを検討する必要があります。 –

+1

あなたが求めてきた制約を頼りにしていることは、賢明なやり方ではありません。コンストラクタを変更したり、std :: vectorを使用することができないのはなぜですか? –

+1

このクラスは、C++側とスクリプト間の対話に必要です。スクリプトは動的配列を割り当ててArr​​ayOwnerでラップします。私はクラス内で好きなものを使うことができますが、コンストラクタはArrayOwner(int * array)でなければなりません。初期の配列のサイズを取得するための移植可能な方法がないので、std :: vectorでは使用できません。 – SadSido

答えて

6

いいえ、残念ながらありません。 C++ RTTIはプリミティブ型に拡張されていません。

5

これを行うためのポータブルな方法はありません。

0

一般的に、(単純/携帯/堅牢な)方法はありません。

あなたのプラットフォームが分かっていて、OSの新しいバージョンごとにコードを変更したい場合は、ヒープの位置とその外観を知ることができますヒープを歩き、このポインタが指し示すブロックの大きさを見たいので、そこにあるアイテムの数を計算することができます。しかし、誰もそれをすることに対してあなたにアドバイスをします。

1

私はそうは思わない。 x[]*xは、もちろんdeleteを呼び出した場合を除き、同義語です。

4

私には悪いデザインのようです。新しいものを分けたり、この方法で削除したりしないでください。

配列はオブジェクトコンストラクタで割り当てられ、パラメータとして渡されません。

C++でのメモリ管理は難しいですが、このような悪い習慣では難しくありません。

+0

彼は「初期化はリソースの取得です」と実装しようとしています(ここを参照してくださいhttp://www.ddj.com/cpp/184403758) – Drakosha

+0

次に、コンストラクタでリソースを取得する必要があります。それが_ptrToArrayが配列を指すことを確実にする唯一の方法です。 – Treb

+1

質問にコメントで言及したように、クライアントスクリプトとの対話があります。 ScriptersはArrayOwner(int * array)のように初期化できる配列ラッパーを必要とします。 p.s.間違いなく悪いデザインですが、スクリプトを直接制御することはできません。私たちは、スクリプタがコード化規則を導入することによって*配列*を渡すように強制することができます... – SadSido

関連する問題