Мне нужны некоторые разъяснения по проблеме, которую я не совсем понимаю. Используя два следующих сценария, я бы подумал, что объем выделенной памяти будет примерно одинаковым. Тем не менее, сценарий 2 дает мне исключение bad_alloc
через некоторое время и, похоже, жует память как сумасшедший (используя диспетчер задач Windows в качестве прокси для объема памяти, выделенного для процесса). Следующее скомпилировано в Windows 32bit с использованием MSVC10.
Скажите, у меня есть следующий базовый класс:
template<class T>
class Base
{
protected:
T x;
public:
Base() {}
Base(T _x) : x(_x){}
virtual bool func() = 0;
};
Теперь, что касается производного класса:
template<class T>
class Derived : public Base<T>
{
public:
Derived() {}
Derived(T _x) : Base(_x){}
bool func() { return true; };
};
Теперь рассмотрим два случая. Во-первых, выделите динамический массив класса Derived и заполните его производными объектами, например:
int main()
{
int size = SOME_LARGE_NUMBER;
Derived<int>* d = new Derived<int>[size];
for (int i = 0; i < size; i++)
{
d[i] = Derived<int>(i);
}
// delete here
}
Во-вторых, выделите динамический массив указателей базового класса и сделайте так, чтобы они указывали на фактические экземпляры класса Derived, например:
int main()
{
int size = SOME_LARGE_NUMBER;
Base<int>** d = new Base<int>*[size];
for (int i = 0; i < size; i++)
{
d[i] = new Derived<int>(i);
}
// delete here
}
Я установил SOME_LARGE_NUMBER в любом сценарии на 40 000 000. В первом сценарии программа завершается нормально - во втором я получаю исключение bad_alloc. Я задаюсь вопросом, является ли это ожидаемым поведением или я что-то упускаю здесь? Если это так, что может быть лучше? Обратите внимание, что я получаю ту же проблему, используя vector<Base<int>*>
и boost::ptr_vector<Base<int>>
.