Re: return string - no double allocation
* Gernot Frisch:
Yes, you can do reference counting on the pointer. A simple
implementation would use boost::shared_ptr, but it does have some
overhead. A smarter implementation would use boost::intrusive_ptr, or
equivalent code.
I never used any of the above techniques. <ash on my head> Can you
briefly explain how I would implement that in my class:
static char* NO_DATA=""; // like NULL, but c_str() can return this
class DGStr
{
public:
DGStr() :m_len(0),m_dat(NO_DATA) {}
DGStr(const DGStr& s):m_len(0),m_dat(NO_DATA) {*this=s;}
DGStr& operator=(const DGStr& s)
{
Alloc(s.m_len);
m_len=s.m_len;
strcpy(m_dat, s.m_dat);
}
~DGStr() {if(m_dat!=NO_DATA) delete[] m_dat;}
const char* c_str()const {return m_dat;}
private:
// very simple non optimized code
void Alloc(int n)
{
char* pD=new char[n+1];
if(m_dat != NO_DATA)
{
memcpy(pD, m_dat, m_len+1);
delete[] m_dat;
}
m_dat = pD;
}
// data
char* m_dat;
int m_len;
}
No explanation because it gets real complicated real fast and I've given a link
to an implementation, and since this is a learning exercise it's important to
focus on the most important thing to learn.
Namely, to first make the code correct, and only then (if at all) optimize.
Correctness issues: you're missing a constructor to create a DGStr with other
than empty string; operator= is missing a result specification; and Alloc
performs a needless copying, presumably to handle self-assignment but that
should be handled in some different way.
Design: it's generally a bad idea to implement a copy constructor in terms of
assignment. Instead implement assignment in terms of copy construction.
Style: never use all uppercase for non-macros (except for idiomatic usage),
always use it for macros.
Cheers & hth.,
- Alf
--
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff! :-) Just going there is good. Linking
to it is even better! Thanks in advance!