Умный указатель С++ на статически и динамически выделенный ресурс

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

пример:

class Base
{
  public:
  virtual ??? foo()=0;
}

class A : public Base
{ 
  private:
  float arr[10];   
  public:
  ??? foo(){ return ???arr; }
}

class B : public Base
{
  public:
  ??? foo(){ 
      allocate array;
      return ???array; 
  }
}

Динамически выделяемый массив создается внутри метода класса, и я бы предпочел использовать std::unique_ptr. Но что мне делать со статически выделенным массивом в классе A?

Должен ли я создать собственный класс, производный от std::unique_ptr, который бы знал о размещении указателя и не пытался уничтожить статически размещенный указатель, или, может быть, такие умные указатели уже существуют?


person bartek    schedule 25.10.2010    source источник
comment
В этом коде нет статически выделенного массива. Это может быть проблемой... В любом случае, если бы у вас был такой массив, то boost::shared_ptr с настраиваемым средством удаления был бы одним из вариантов. Однако у него есть некоторые накладные расходы. Если накладные расходы окажутся неприемлемыми, вы можете создать свой собственный на основе boost::intrusive_ptr, у которого нет этой проблемы с накладными расходами (динамическое выделение).   -  person Cheers and hth. - Alf    schedule 25.10.2010
comment
По памяти std::shared_ptr предоставляет конструктор, в котором он может владеть одним объектом, но на самом деле указывать на другой именно для этой цели. На самом деле я не могу найти никаких доказательств этого в MSDN, и при этом я не могу написать какой-либо код, который использует это.   -  person Puppy    schedule 25.10.2010


Ответы (1)


Вы можете предоставить собственные средства удаления для умных указателей Boost. Это также может быть пустой функцией, которая ничего не делает. Для класса, возвращающего динамически выделенный массив, вы можете использовать стандартный shared_array, а для класса, возвращающего указатель на статически выделенный массив, вы можете вернуть shared_array с пустым пользовательским методом удаления.

Обратите внимание, что ваша проблема здесь лежит глубже. Возврат указателя, который будет принадлежать вызывающей стороне, отличается от возврата указателя, принадлежащего объекту. Вы можете подумать о том, чтобы не смешивать эти два в одной и той же функции.

person Björn Pollex    schedule 25.10.2010