2009-06-22 33 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++中的内存管理很难,不要因为这样的不良做法而变得更难。

相关问题