有没有办法检测指针是否指向数组?

时间:2009-06-22 07:45:39

标签: c++ arrays pointers

有没有办法检测,指针是否指向C ++中的数组?我的问题是我想实现一个类,它成为数组的所有者。我的类用指针初始化,我想知道,指针是否真的是一个数组指针。这是简化的代码:

class ArrayOwner {
public:
   explicit ArrayOwner( int* initialArray ) : _ptrToArray(initialArray) {}
   virtual ~ArrayOwner() { delete [] _ptrToArray; }
private:
   int* _ptrToArray;
}
  • 这种用法没问题: ArrayOwner foo(new int [10]);
  • 但这种用法 导致未定义的行为: ArrayOwner foo(new int());

我想在构造函数中添加assert,“initialArray”指针实际上是一个数组指针。我无法更改构造函数的合约,使用向量e.t.c.有没有办法在C ++中编写这个断言?

5 个答案:

答案 0 :(得分:6)

不,不幸的是没有。 C ++ RTTI没有扩展到原始类型。

答案 1 :(得分:5)

没有可移植的方法。

答案 2 :(得分:4)

对我来说,这看起来很糟糕。不要将new分开并以这种方式删除。

数组应该在对象构造函数中分配,而不是作为参数传递。

C ++中的内存管理很难,不要因为这样的不良做法而变得更难。

答案 3 :(得分:1)

我不这么认为。 x[]*x是同义词,当然,除非您在其上调用delete

答案 4 :(得分:0)

通常,没有(简单/便携/强健)方法。

话虽如此,如果您了解自己的平台并且愿意为每个新版本的操作系统更改代码,您可能能够找到堆的位置以及它们的外观,因此您可能需要遍历堆并查看此指针指向的块的大小,以便您可以计算其中的项目数。但每个人都会建议你不要这样做。