Re: I don't get why smart pointers are useful.
* 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;}
This should not have compiled. You can't return a type. You must return a value.
One therefore suspects that you're not posting actual code.
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();
}
Hirr hirr! :-)
Well, enough about that joke, but seriously, your 'm_Arr' should be
std::vector<std::string> m_Arr;
and that's it.
Except for efficiency. std::string is a rather inefficient mutable string
class. But mostly serves well enough, and in above example would do fine.
Then the OnBnClickedOk code would be
void CSTLTestDlg::OnBnClickedOK()
{
std::string const aNew = "Hello World";
AfxMessageBox( aNew.c_str(), MB_OK );
m_Arr.push_back( aNew );
AfxMessageBox( m_arr[0].c_str(), MB_OK );
char const* pcData = aNew.data();
m_arr.clear();
}
Cheers, & hth.,
- Alf