Любой способ определить, указывает ли указатель на массив? - PullRequest
4 голосов
/ 22 июня 2009

Есть ли способ обнаружить, указывает ли указатель на массив в 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 ());

Я бы хотел добавить в конструктор утверждение, что указатель «initialArray» действительно является указателем массива. Я не могу изменить контракт конструктора, используйте векторы e.t.c. Есть ли способ написать это утверждение в C ++?

Ответы [ 5 ]

6 голосов
/ 22 июня 2009

Нет, к сожалению, нет. C ++ RTTI не распространяется на примитивные типы.

5 голосов
/ 22 июня 2009

Нет портативного способа сделать это.

4 голосов
/ 22 июня 2009

Это выглядит как плохой дизайн для меня. Не отделяйте новое и удаляйте таким образом.

Массив должен быть размещен в конструкторе объектов, а не передаваться в качестве параметра.

Управление памятью в C ++ сложно, не усложняйте при такой плохой практике.

1 голос
/ 22 июня 2009

Я так не думаю. x[] и *x являются синонимами, за исключением, конечно, когда вы звоните delete на них.

0 голосов
/ 22 июня 2009

Как правило, нет простого (переносимого / надежного) способа сделать это.

Сказав, что, если вы знаете свою платформу и готовы менять свой код для каждой новой версии ОС, вы, возможно, сможете узнать, где находятся кучи и как они выглядят, так что вы можете захотеть пройтись по куче и увидеть размер блока, на который указывает этот указатель, так что вы можете рассчитать количество элементов там. Но все будут советовать вам не делать этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...