stdmap - c++ inseting User Defined class into map -


i've been looking around quite time , think have of pieces code still won't work...

i have map,

    map<number, entry> chainlist; 

and class number , entry, entry wont worry i'm pretty sure half works correct

in number.h class number {     public:      //public functions         //constructor/destructor         number(int len);         number(string copy);         number(const unsigned char *copy, int len);         number(const number& in);         ~number();          .......         .......          friend void swap(number& first, number& second);              bool operator<(const number& rhs) const;         number& operator=(number &rhs);          private:             //our binary number array             unsigned char *num;             //hold length used, , maxsize of array             int length; }; 

then,

//in number.cpp number::~number() {     delete [] num;   }  number::number(const number& in) { length = in.length; num = (unsigned char *) calloc(length, sizeof(unsigned char));      (int = 0; < length; i++)     {         num[i] = in.num[i];     }    }  bool number::operator<(const number& rhs) const {     if (this -> length > rhs.length)     {         return false;     }      (int = 0; < -> length; i++)     {         if (this -> num[i] > rhs.num[i])         {             return false;         }         else if (this -> num[i] < rhs.num[i])         {             return true;         }     }      return false; }  void swap(number& first, number& second) {         // enable adl (not necessary in our case, practice)        using std::swap;          // swapping members of 2 classes,         // 2 classes swapped         swap(first.length, second.length);         swap(first.num, second.num); }   number& number::operator=(number &rhs) {     swap (*this, rhs);     return *this; } 

however when try , insert item map seg fault....

in database.cpp .... chainlist.insert(pair<number, entry>(*(tempentry -> msghash),  *tempentry)); ..... 

where tempentry -> msghash number* - dynamically allocated

what issue be? option have function typecasts , returns c++ string, question std::less_than function work null characters in middle of statement, know works in lexigraphical order first null?

i think problem in operator<():

if (this->length > rhs.length)     return false; (int = 0; < rhs.length; i++)     .... 

see? if rhs.length greater this->length go on , compare bytes. compare rhs.length bytes, , might overflow this->num, this->length less or equal rhs.length.

i'm not sure if need specific sorting order, like:

if (this->length > rhs.length)     return false; if (this->length < rhs.length)     return true; (int = 0; < rhs.length; i++)     .... 

now, when reach loop sure both arrays same length.

update:

you have important issue in operator=(number &rhs). operator should never modify right-hand-side operator. should operator=(const number &rhs) or operator=(number rhs), never non-const reference, yours is.

you trying implement copy-and-swap idiom. got right, proper way is:

number& number::operator=(number rhs) {     swap (*this, rhs);     return *this; } 

update #2:

you allocating array calloc() freeing delete[]. undefined behaviour. memory allocated calloc() freed free(), , memory allocated new[] freed delete[].

my advice use std::vector<unsigned char> hold dynamic arrays, , avoid this->length, delete[], etc. std::swap() on vectors , it's done.


Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -