Если у вас есть класс, предназначенный для семантики копирования, и вы выделяете / освобождаете кучу памяти без необходимости, я могу посчитать это плохой практикой. В общем, правда, это не так. Есть много классов, которые могут использовать кучу хранилища. Просто убедитесь, что у вас нет утечек памяти (освободите объекты в деструкторе, счетчиках ссылок и т. Д.), И все в порядке.
Если вы хотите большей гибкости, попробуйте указать вашему пользователю Allocator . Я объясню.
Некоторые классы, например std::vector
, строка, карта и т. Д. нужно хранилище кучи для структур данных, которые они представляют. Это не считается плохими манерами; если у вас автоматически выделен vector
, пользователь должен знать, что буфер выделяется при вызове конструктора vector
:
void foo() {
// user of vector knows a buffer that can hold at least 10 ints
// gets allocated here.
std::vector<int> foo(10);
}
Аналогично, для std::string
вы знаете, что есть внутреннее выделение кучи char*
. Есть ли по одному на string
экземпляр, как правило, зависит от реализации STL; часто они подсчитывают ссылки.
Тем не менее, почти для всех классов STL пользователи do могут выбирать, куда их поместить, в том смысле, что они могут указать распределитель. vector
определяется примерно так:
template <typename T, typename Alloc = DefaultAllocator<T> >
class vector {
// etc.
};
Внутренне, vector
использует Alloc
(который по умолчанию равен тому, что используется по умолчанию для T для распределителя), чтобы выделить буфер и другое хранилище кучи, которое может понадобиться. Если пользователям не нравится стратегия размещения по умолчанию, они могут указать свою собственную:
vector<int, MyCustomAllocator> foo(10);
Теперь, когда конструктор выделяет, он будет использовать MyCustomAllocator
вместо значения по умолчанию. Вот некоторые подробности по написанию собственного распределителя STL .
Если вы беспокоитесь о том, что использование кучи для определенного хранилища в вашем классе может быть «нехорошим способом», вы можете рассмотреть возможность предоставления пользователям вашего класса такой опции, чтобы они могли указать, как распределяться, если ваша стратегия по умолчанию не соответствует их потребностям.