C++ memory leak with 2d array pointer -
the 3 functions below contain memory leaks @ lines marked "// memory leak vvv" according dr. memory. i'm relatively new c++ , pointers , not sure why these lines causing leaks. "values_" t** , member variable undoarray class.
template <class t> void undoarray<t>::set(size_type i, const t& v) { counts_[i]++; if(!initialized(i)) { // memory leak vvv values_[i] = new t[1]; values_[i][0] = v; } else { // memory leak vvv t* temp = new t[counts_[i]]; for(int j = 0; j < counts_[i] - 1; j++) { temp[j] = values_[i][j]; } temp[counts_[i] - 1] = v; delete [] values_[i]; values_[i] = temp; } } template <class t> void undoarray<t>::undo(size_type i) { counts_[i]--; if(counts_[i] == 0) { values_[i] = null; } else { t* temp = values_[i]; // memory leak vvv values_[i] = new t[counts_[i]]; for(int j = 0; j < counts_[i]; j++) { values_[i][j] = temp[j]; } delete [] temp; } } template <class t> void undoarray<t>::copy(const undoarray<t>& ua) { size_ = ua.size_; counts_ = new unsigned[size_]; for(int = 0; < size_; i++) { counts_[i] = ua.counts_[i]; } values_ = new t*[size_]; for(int = 0; < size_; i++) { if(counts_[i] == 0) { values_[i] = null; } else { // memory leak vvv values_[i] = new t[counts_[i]]; for(int j = 0; j < counts_[i]; j++) { values_[i][j] = ua.values_[i][j]; } } } }
the constructor undoarray uses...
template <class t> void undoarray<t>::create() { size_ = 0; counts_ = new unsigned[size_]; values_ = new t*[size_]; }
... if default constructor called (no arguments) or ...
template <class t> void undoarray<t>::create(size_type n) { size_ = n; counts_ = new unsigned[size_]; for(int = 0; < size_; i++) counts_[i] = 0; values_ = new t*[size_]; for(int = 0; < size_; i++) values_[i] = null; }
... if initial array size specified.
the destructor looks like...
template <class t> undoarray<t>::~undoarray() { delete [] counts_; if(values_ != null) { for(int = 0; < size_; i++) { delete [] values_[i]; } } delete [] values_; }
there several things not ok in code:
i.e.
template <class t> void undoarray<t>::copy(const undoarray<t>& ua) { size_ = ua.size_; counts_ = new unsigned[size_]; for(int = 0; < size_; i++) { counts_[i] = ua.counts_[i]; } //what if values_ not null here? not delete old data values_ = new t*[size_];
and there more situations in code posted similar.
edit1: give example
template <class t> void undoarray<t>::undo(size_type i) { counts_[i]--; if(counts_[i] == 0) { //what if values_[i] != nullptr here? leak old value... values_[i] = null;
of course should make sure delete each pointer in destructor.
like:
~undoarray() { if (nullptr != values_) { (int = 0; < size_; ++i) { delete [] values[i]; } delete [] values; } }
Comments
Post a Comment