我需要澄清一个我不太明白的问题。使用以下两种情况,我会认为分配的内存量大致相同。但是,场景 2bad_alloc
在一段时间后给了我一个异常,并且似乎在疯狂地消耗内存(使用 Window 的任务管理器作为分配给进程的内存量的代理)。以下是在 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 类的动态数组并用 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
}
其次,分配 Base 类的动态指针数组,并让它们指向 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>*>
and遇到了同样的问题boost::ptr_vector<Base<int>>
。