使用allocator实现矢量类:EXC_BAD_ACCESS

时间:2012-06-15 12:51:32

标签: c++ allocator variadic-functions

我正在为练习实施一个矢量。

我想做以下事情:

  

最初分配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;
}

我没有任何例外。有人可以解释原因吗?

2 个答案:

答案 0 :(得分:4)

最可能的原因是在具有可变参数的构造函数中,您不初始化length_size。这意味着当您致电push_back时,这些值可能是任何值。

如果您在调试器中运行应用程序并检查这些变量,那就显而易见了。我建议下次遇到某种类型的崩溃时,在调试器中运行它并首先尝试解决它,然后再问这里。

答案 1 :(得分:3)

您的Vector(int n,...)构造函数不分配内存。不初始化length_size。然后,您立即从push_back()构造函数中调用Vector(int n,...)。 当它调用push_back时,支票if(length==_size)将无法正常工作,因为它们都包含垃圾值。