我目前正在使用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;
}
答案 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);}