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

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -