2009-06-22 50 views
4

有沒有什麼辦法來檢測,指針是否指向C++中的數組?我的問題是我想實現一個類,它成爲數組的所有者。我的類是用指針初始化的,我想知道,指針是否真的是一個數組指針。下面是簡化的代碼:任何方式來檢測指針是否指向數組?

class ArrayOwner { 
public: 
    explicit ArrayOwner(int* initialArray) : _ptrToArray(initialArray) {} 
    virtual ~ArrayOwner() { delete [] _ptrToArray; } 
private: 
    int* _ptrToArray; 
} 
  • 這種用法會確定:ArrayOwner FOO(新INT [10]);
  • 但是這種用法 導致未定義的行爲: ArrayOwner foo(new int());

我想在構造函數中添加assert,即「initialArray」指針確實是一個數組指針。我不能改變構造函數的合約,使用vector e.t.c.有什麼方法可以在C++中編寫這個斷言?

+0

您應該考慮是否可以使用類似Boost Array(http://www.boost.org/doc/libs/1_39_0/doc/html/array.html)的內容。 – 2009-06-22 07:55:06

+1

沒有明智的方式去做你所要求的約束條件。爲什麼你不能改變構造函數或使用std :: vector? – 2009-06-22 08:01:27

回答

6

不,不幸的不是。 C++ RTTI不擴展到基元類型。

5

有沒有便攜的方式來做到這一點。

0

一般來說,沒有(簡單/便攜/強大)的方式來做到這一點。儘管如此,如果你知道自己的平臺,並且你願意爲每個新版本的操作系統更改你的代碼,你可能能夠找出堆的位置以及它們的外觀,所以你可以想要遍歷堆並查看該指針所指向的塊的大小,以便計算其中的項目數量。但是每個人都會建議你不要這樣做。

1

我不這麼認爲。 x[]*x是同義詞,當然,除非你給他們打電話delete

4

它看起來像一個糟糕的設計給我。不要分開新的和刪除這種方式。

該數組應該在對象構造函數中分配,而不是作爲參數傳遞。

C++中的內存管理很難,不要因爲這樣的不良做法而變得更難。