2010-10-25 3 views
2

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

пример:

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, который будет знать о распределении точек и не будет пытаться уничтожить статически назначенный указатель, или, может быть, уже существуют такие умные указатели?

+3

У вас нет статически выделенного массива в этом коде. Это может быть проблемой ... В любом случае, если бы у вас был такой массив, то одним из вариантов был бы «boost :: shared_ptr» w/custom deleter. Однако у него есть некоторые накладные расходы. Если накладные расходы оказались неприемлемыми, вы можете создать свой собственный на основе 'boost :: intrusive_ptr', который не имеет этой служебной задачи (динамическое распределение). –

+0

Из памяти std :: shared_ptr предоставляет конструктор, где он может «владеть» одним объектом, но на самом деле указывает на другой, для этой цели. На самом деле я не могу найти никаких доказательств этого в MSDN, и я также не могу написать код, который использует это. – Puppy

ответ

5

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

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

Смежные вопросы