S
Simon L
Pointer mismanagement is a big cause of bugs in software that I work
on. I decided to invest a little time into
having a look at auto_ptr and other smart pointers but I don't see how
they'll save me making the same mistakes.
A typical use and source of buggy pointers is in a collection of
objects. My containers of choice, eg stl::vector
don't like auto_ptr so I've had to use some MFC template classes.
In this test app I don't see how my pointers are suddenly safe or
smart. Yes they transfer ownership, yes they
auto delete but what I was hoping (expecting) was that manipulation of
old (ie ownership transferred or cleaned)
auto_ptrs would be handled.
Use of the pointer selection -> on my old auto_ptr blows up my app.,
gaining me very little as far as I can see.
Is it that my demo. app. is too trivial to see the benefits? If I have
to wrap all use of my object in if( something !=null) then I've
gained nothing.
Thanks
class cNew
{
public:
cNew(int i, LPCTSTR pc)
{
iNew = i;
strcpy(cText , pc);
}
char* GetCNew(){return cNew;}
int iNew;
char cText[256];
};
CList<auto_ptr<sNew> , auto_ptr<sNew>& > m_Arr;
void CSTLTestDlg::OnBnClickedOk()
{
auto_ptr<sNew> aNew ( new cNew(1, CString("Hello World")));
AfxMessageBox( aNew->GetCNew() , MB_OKCANCEL );
m_Arr.AddTail( aNew );
//ownership of cNew passes to an auto_ptr in my List
AfxMessageBox( m_Arr.GetHead()->GetCNew() , MB_YESNO );
//seems to contain valid data
char* pcData = aNew->GetCNew();
//pcData is non null eg random memory
int iData = aNew->iNew;
//exception
m_Arr.RemoveAll();
OnOK();
}
on. I decided to invest a little time into
having a look at auto_ptr and other smart pointers but I don't see how
they'll save me making the same mistakes.
A typical use and source of buggy pointers is in a collection of
objects. My containers of choice, eg stl::vector
don't like auto_ptr so I've had to use some MFC template classes.
In this test app I don't see how my pointers are suddenly safe or
smart. Yes they transfer ownership, yes they
auto delete but what I was hoping (expecting) was that manipulation of
old (ie ownership transferred or cleaned)
auto_ptrs would be handled.
Use of the pointer selection -> on my old auto_ptr blows up my app.,
gaining me very little as far as I can see.
Is it that my demo. app. is too trivial to see the benefits? If I have
to wrap all use of my object in if( something !=null) then I've
gained nothing.
Thanks
class cNew
{
public:
cNew(int i, LPCTSTR pc)
{
iNew = i;
strcpy(cText , pc);
}
char* GetCNew(){return cNew;}
int iNew;
char cText[256];
};
CList<auto_ptr<sNew> , auto_ptr<sNew>& > m_Arr;
void CSTLTestDlg::OnBnClickedOk()
{
auto_ptr<sNew> aNew ( new cNew(1, CString("Hello World")));
AfxMessageBox( aNew->GetCNew() , MB_OKCANCEL );
m_Arr.AddTail( aNew );
//ownership of cNew passes to an auto_ptr in my List
AfxMessageBox( m_Arr.GetHead()->GetCNew() , MB_YESNO );
//seems to contain valid data
char* pcData = aNew->GetCNew();
//pcData is non null eg random memory
int iData = aNew->iNew;
//exception
m_Arr.RemoveAll();
OnOK();
}