解除分配内存时访问冲突

时间:2013-08-29 23:17:53

标签: c++ memory-management vector

我目前正在使用Accelerated C ++,而我正在尝试在CH11中创建我的版本。当试图通过析构函数释放内存时,无论是创建一个空的“Vec”还是使用pushback创建一个空的“Vec”,我都会获得读访问内存。我不太确定我错过了什么。 谢谢你的帮助。

#include "Vec.h"
int main()
{
Vec<int> v;

return 0;
}

/////////

#include <algorithm>
#include <cstddef>
#include <memory>


using std::max;

/////////////////////////////
template <class T> class Vec {
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef size_t size_type;
    typedef T value_type;
    typedef T& reference;
    typedef const T& const_reference;

    //Constructor
    Vec() { create();}
    explicit Vec(size_type n, const T& = T()) {create(n,t);}

    //Copy
    Vec(const Vec& v) {create(v.begin(), v.end());}
    //Assignment
    Vec& operator=(const Vec&);
    //Destructor
    ~Vec() { uncreate();}

    //Indexing
    T& operator[](size_type i) {return data[i]; }
    const T& operator[](size_type i) const { return data[i]; }



    //Size
    size_type size() const { return avail - data; } 

    //Return member variables
    iterator begin() { return data; }
    const_iterator begin() const { return data; }

    iterator end() { return avail; }
    const_iterator end() const {return avail; }

    //Uncreate
    void clear() { uncreate(); }
    //Check empty
    bool empty() const { return data == avail; }
//////////////////////
private:
    iterator data; //first
    iterator avail; //(one past) last element
    iterator limit; //(one past) allocated memory

    std::allocator<T> alloc; // object for memory allocation

    //allocate and initialize thorugh constructors
    void create();
    void create( size_type, const T&);
    void create(const_iterator, const_iterator);

    //destory 
    void uncreate();


};
////////////////////////////
template <class T> void Vec<T>::create()
{
    data = avail = limit;
}

template <class T> void Vec<T>::create(size_type n, const T& val)
{
    data = alloc.allocate(n , 0);
    limit = avail = data + n;
    std::uninitialized_fill(data, limit, val);
}

template <class T> void Vec<T>::create(const_iterator i, const_iterator j)
{
    data = alloc.allocate(j - i, 0);
    limit = avail = std::uninitialized_copy(i , j, data);
}

template <class T> void Vec<T>::uncreate()
{
    if(data) {
        iterator it = avail;
        while(it != data)
            alloc.destroy(--it);
        alloc.deallocate(data, limit - data);
    }
    data = limit = avail = 0;
}

1 个答案:

答案 0 :(得分:0)

两个构造函数都需要在使用之前在初始化列表中初始化它们的成员(SB指出在被赋予确定值之前在create()中使用)。当析构函数被触发时,您可能正在使用不确定的指针值,并将其发送以解除分配。

改变这个:

Vec() { create();}
explicit Vec(size_type n, const T& = T()) {create(n,t);}

对此:

Vec() : data(), avail(), limit() { create();}
explicit Vec(size_type n, const T& t = T()) 
    : data(), avail(), limit() {create(n,t);}