Changeset 2437


Ignore:
Timestamp:
Feb 17, 2009, 12:05:25 PM (16 years ago)
Author:
Christoph Mayer
Message:

-memory leaks und corruption gefixt

Location:
source/ariba
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/Name.cpp

    r2409 r2437  
    3939#include "Name.h"
    4040
    41 namespace ariba {
    42 const Name Name::UNSPECIFIED;
    43 }
    44 
    4541std::ostream& operator<<( std::ostream& s, const ariba::Name& n ) {
    4642        return s << n.toString();
    4743}
    4844
     45namespace ariba {
     46
     47const Name Name::UNSPECIFIED;
     48
     49void Name::init(const char* name, int len, bool copy, bool hreadable) {
     50
     51        // delete the old buffer
     52        if( _bytes != NULL ) {
     53                delete[] _bytes;
     54                _bytes = NULL;
     55                _length = 0;
     56        }
     57
     58        // alloc new stuff
     59        if (len == -1)
     60                len = strlen(name);
     61
     62        if (copy) {
     63
     64                if ((name!=NULL) && (len>0)){
     65                        _bytes = new uint8_t[len];
     66                        memcpy( _bytes, name, len );
     67                } else {
     68                        len = 0;
     69                        _bytes = NULL; 
     70                }
     71
     72        } else {
     73                _bytes = (uint8_t*)name;
     74        }
     75
     76        _copy = copy;
     77        _length = len;
     78        _hreadable = hreadable;
     79}
     80
     81Name::Name()
     82        : _bytes( NULL ), _length( 0 ), _copy( false ), _hreadable( false) {
     83}
     84
     85Name::Name(const char* name, int len, bool copy)
     86        : _bytes( NULL ), _length( 0 ), _copy( false ), _hreadable( false) {
     87        init(name, len, copy, len == -1);
     88}
     89
     90Name::Name(string name)
     91        : _bytes( NULL ), _length( 0 ), _copy( false ), _hreadable( false) {
     92        init(name.c_str(), name.length(), true, true);
     93}
     94
     95Name::Name(const Name& name)
     96        : _bytes( NULL ), _length( 0 ), _copy( false ), _hreadable( false) {
     97        init((const char*)name.bytes(), name.length(), true, name._hreadable);
     98}
     99
     100Name::~Name() {
     101        if (_copy && (_bytes!=NULL)){
     102                delete[] _bytes;
     103                _bytes = NULL;
     104                _length = 0;
     105        }
     106}
     107
     108const uint8_t* Name::bytes() const {
     109        return _bytes;
     110}
     111
     112const size_t Name::length() const {
     113        return _length;
     114}
     115
     116bool Name::operator==(const Name& name) const {
     117
     118        // unspecified Name objects
     119        if (_bytes == NULL && name._bytes == NULL &&
     120                length() == name.length()) return true;
     121       
     122        // specified name objects
     123        if (_bytes == NULL || name._bytes == NULL) return false;
     124        if (name.length() != length()) return false;
     125        return (memcmp(name.bytes(), bytes(), length()) == 0);
     126}
     127
     128bool Name::operator!=(const Name& name) const {
     129        return !(*this == name);
     130}
     131
     132bool Name::isUnspecified() const {
     133        return *this == UNSPECIFIED;
     134}
     135
     136Name Name::random() {
     137        char name[17];
     138        for (int i=0;i<16; i++)
     139                name[i] = ("abcdefghijklmnopqrstuvwxyz")[((unsigned)rand())%26];
     140        name[16] = 0;
     141
     142        // force use of the std::string ctor with this
     143        return Name( string(name) );
     144}
     145
     146string Name::toString() const {
     147        if (_hreadable) {
     148                char str[256];
     149                for (int i=0; i<length(); i++) str[i] = bytes()[i];
     150                str[length()] = 0;
     151                return string(str);
     152        } else {
     153                return string("<not readable>");
     154        }
     155}
     156
     157NodeID Name::toNodeId() const {
     158        if( bytes()==NULL || length()==0 ) return NodeID::UNSPECIFIED;
     159        return NodeID( Identifier::sha1(bytes(),length()) );
     160}
     161
     162SpoVNetID Name::toSpoVNetId() const {
     163        if( bytes()==NULL || length()==0 ) return SpoVNetID::UNSPECIFIED;
     164        return SpoVNetID( Identifier::sha1(bytes(),length()) );
     165}
     166
     167} // namespace ariba
  • source/ariba/Name.h

    r2409 r2437  
    4242#include <iostream>
    4343#include <memory.h>
     44#include <string>
     45
     46using std::string;
    4447
    4548// forward declaration
     
    6063class Name {
    6164        friend std::ostream& operator<<( std::ostream&, const ::ariba::Name& );
    62 
    63 private:
    64         bool _hreadable;
    65         bool _copy;
    66         int _length;
    67         uint8_t* _bytes;
    68 
    69         inline void init(const char* name, int len, bool copy, bool hreadable) {
    70                 if (len == -1)
    71                         len = strlen(name);
    72 
    73                 if (copy) {
    74                         _bytes = new uint8_t[len];
    75                         memcpy(_bytes, name, len);
    76                 } else {
    77                         _bytes = (uint8_t*)name;
    78                 }
    79 
    80                 _copy = copy;
    81                 _length = len;
    82                 _hreadable = hreadable;
    83         }
    84 
    8565public:
    8666        static const Name UNSPECIFIED;
    8767
    88 public:
    8968        /**
    9069         * Constructs a new, yet unspecified name.
    9170         */
    92         inline Name() {
    93                 _bytes = NULL;
    94                 _length = 0;
    95                 _copy = false;
    96                 _hreadable = false;
    97         }
     71        Name();
    9872
    9973        /**
     
    10579         * @param copy A flag, whether the name's memory needs to be copied
    10680         */
    107         inline Name(const char* name, int len = -1, bool copy = false) {
    108                 init(name, len, copy, len == -1);
    109         }
     81        Name(const char* name, int len = -1, bool copy = false);
    11082
    11183        /**
     
    11486         * @param name A human readable name
    11587         */
    116         inline Name(std::string name) {
    117                 init(name.c_str(), -1, true, true);
    118         }
     88        Name(string name);
    11989
    12090        /**
    12191         * The copy constructor.
    12292         */
    123         inline Name(const Name& name) {
    124                 init((const char*)name.bytes(), name.length(), true, name._hreadable);
    125         }
     93        Name(const Name& name);
    12694
    12795        /**
    12896         * Destroys the name and releases underlying memory if this name is a copy.
    12997         */
    130         inline ~Name() {
    131                 if (_copy) delete _bytes;
    132         }
     98        virtual ~Name();
    13399
    134100        /**
     
    137103         * @return The binary data
    138104         */
    139         inline const uint8_t* bytes() const {
    140                 return _bytes;
    141         }
     105        const uint8_t* bytes() const;
    142106
    143107        /**
     
    146110         * @return The length of the name
    147111         */
    148         inline const size_t length() const {
    149                 return _length;
    150         }
     112        const size_t length() const;
    151113
    152114        /**
    153115         * The common implementation of the "equal" operator.
    154116         */
    155         inline bool operator==(const Name& name) const {
    156                 if (_bytes == NULL || name._bytes == NULL) return false;
    157                 if (name.length() != length()) return false;
    158                 return (memcmp(name.bytes(), bytes(), length()) == 0);
    159         }
     117        bool operator==(const Name& name) const;
    160118
    161119        /**
    162120         * The common implementation of the "unequal" operator.
    163121         */
    164         inline bool operator!=(const Name& name) const {
    165                 return !(*this == name);
    166         }
     122        bool operator!=(const Name& name) const;
    167123
    168124        /**
    169125         * Returns true, if the name is yet unspecified
    170126         */
    171         inline bool isUnspecified() {
    172                 return *this == UNSPECIFIED;
    173         }
     127        bool isUnspecified() const;
    174128
    175129        /**
    176130         * Returns a random name.
    177131         */
    178         inline static Name random() {
    179                 char name[17];
    180                 for (int i=0;i<16; i++)
    181                         name[i] = ("abcdefghijklmnopqrstuvwxyz")[((unsigned)rand())%26];
    182                 name[16] = 0;
    183                 return Name(name);
    184         }
     132        static Name random();
    185133
    186134        /**
    187135         * Returns a human-readable representation of this name
    188136         */
    189         inline std::string toString() const {
    190                 if (_hreadable) {
    191                         char str[256];
    192                         for (int i=0; i<length(); i++) str[i] = bytes()[i];
    193                         str[length()] = 0;
    194                         return std::string(str);
    195                 } else {
    196                         return std::string("<not readable>");
    197                 }
    198         }
     137        string toString() const;
    199138
    200139        // hack: to be changed!
    201         inline NodeID toNodeId() const {
    202                 return NodeID::sha1( bytes(), length() );
    203         }
     140        NodeID toNodeId() const;
    204141
    205142        // hack: to be changed!
    206         inline SpoVNetID toSpoVNetId() const {
    207                 return SpoVNetID::sha1(bytes(), length() );
    208         }
     143        SpoVNetID toSpoVNetId() const;
     144
     145private:
     146        bool _hreadable;
     147        bool _copy;
     148        int _length;
     149        uint8_t* _bytes;
     150
     151        void init(const char* name, int len, bool copy, bool hreadable);
    209152};
    210153
Note: See TracChangeset for help on using the changeset viewer.