c++ - Double free or corruption, why does this appear? -
i've finished smart pointer (i know...) uploaded univerity's website runs number of automated tests on code. there 2 things wrong number of tests:
- memory or time limit exceeded
 - memory access problem (ie. null pointer)
 
the thing don't know kind of tests being excecuted. able read automated tests' stdout did, written there:
in instantiation of ‘my_pointer<t>::my_pointer() [with t = tester]’: error: no matching function call ‘tester::tester()’ note: candidates are: tester::tester(my_pointer<tester>) candidate expects 1 argument, 0 provided tester::tester(const tester&) candidate expects 1 argument, 0 provided   so i'm guessing odd reason won't invoke my_pointer() constructor? smart pointer class:
template<class t> class my_pointer {     t* raw_pointer;  public:     my_pointer() {         raw_pointer = new t();         raw_pointer->increfcnt();     }      my_pointer(t *obj) : raw_pointer(obj) {         if(raw_pointer != null) raw_pointer->increfcnt();     }      my_pointer(const my_pointer<t>& smart_pointer) : raw_pointer(smart_pointer.raw_pointer) {         if(raw_pointer != null) raw_pointer->increfcnt();     }      t& operator*() {         return *raw_pointer;     }      t* operator->() {         return raw_pointer;     }      operator t*() {         return raw_pointer;     }      my_pointer<t> &operator=(const my_pointer<t> &smart_pointer) {         if(this != &smart_pointer && raw_pointer != null) {             /** if last reference given memory address */             if (raw_pointer->decrefcnt() == 0) {             delete raw_pointer;                                 }              raw_pointer = smart_pointer.raw_pointer;             raw_pointer->increfcnt();         }          return *this;     }      bool operator== (const t* pointer) {         return raw_pointer == pointer;     }      bool operator!= (const t* pointer) {         return raw_pointer != pointer;     }      bool operator== (const my_pointer<t> &smart_pointer) {         return raw_pointer == smart_pointer.raw_pointer;     }      bool operator!= (const my_pointer<t> &smart_pointer) {         return raw_pointer != smart_pointer.raw_pointer;     }      ~my_pointer() {        if(raw_pointer->decrefcnt() == 0 && raw_pointer != null) {            delete raw_pointer;         }     } };   this class, in references can counted:
class refcounted { private:     int count; public:     refcounted() : count(0) { }      int increfcnt() {         return ++count;     }      int decrefcnt() {         return --count;     } };   can see problems code? in advance!
you unconditionally deleting raw pointer in destructor. wrong. must decrement reference count, , delete if becomes zero.
you call raw_pointer->increfcnt(); in several places without checking whether raw_pointer null.
Comments
Post a Comment