我正在为练习实施一个矢量。
我想做以下事情:
最初分配
100
元素而不调用它的构造函数。每当一个对象被添加到向量时,它就会调用它的构造函数,直到向量太大而不能包含所有对象。当向量已满时,我会分配其他100
个对象,依此类推。
这是代码:
#include <iostream>
#include <memory>
#include <exception>
#include <cstdarg>
using namespace std;
class indexOutOfBounds:exception
{
const virtual char* what()
{
return "Index out of bounds";
}
};
template <class T>
class Vector
{
private:
T* data;
allocator<T> data_all;
int length;
int _size;
public:
static const int block=100; // the size of a single allocation block
Vector()
{
data=data_all.allocate(block,NULL);
length=0;
_size=block;
}
Vector(int n,...)
{
va_list vl;
T temp;
va_start(vl, n);
for(int i=0; i<n;i++)
{
temp=va_arg(vl,T);
push_back(temp);
}
va_end(vl);
}
int size() const
{
return length;
}
void push_back(T item)
{
length++;
if(length==_size)
{
_size+=block;
data=data_all.allocate(_size,data);
}
data_all.construct(&data[length-1],item);
}
T& operator[] (int i) throw()
{
if(i<0 || i>=length)
throw indexOutOfBounds();
return data[i];
}
~Vector()
{
for(int i=0; i<length;i++)
{
data_all.destroy(&data[i]);
}
data_all.deallocate(data,_size);
}
};
int main(int argc, char** argv)
{
Vector<int> v(1,0);
cout << v[0] << endl;
return 0;
}
我尝试打印v[0]
时出现异常:
EXC_BAD_ACCESS(代码= 1,地址= 0x0)
也许&v[0]
是NULL
,但我无法弄清楚原因。如果我不使用va_list
的构造函数,我只需写一个像这样的main:
int main(int argc, char** argv)
{
Vector<int> v;
v.push_back(1);
cout << v[0] << endl;
return 0;
}
我没有任何例外。有人可以解释原因吗?
答案 0 :(得分:4)
最可能的原因是在具有可变参数的构造函数中,您不初始化length
或_size
。这意味着当您致电push_back
时,这些值可能是任何值。
如果您在调试器中运行应用程序并检查这些变量,那就显而易见了。我建议下次遇到某种类型的崩溃时,在调试器中运行它并首先尝试解决它,然后再问这里。
答案 1 :(得分:3)
您的Vector(int n,...)
构造函数不分配内存。不初始化length
,_size
。然后,您立即从push_back()
构造函数中调用Vector(int n,...)
。
当它调用push_back
时,支票if(length==_size)
将无法正常工作,因为它们都包含垃圾值。