If you are using the main C++ distribution of wxWidgets, Feel free to ask any question related to wxWidgets development here. This means questions regarding to C++ and wxWidgets, not compile problems.
-
cecilio
- I live to help wx-kind

- Posts: 189
- Joined: Fri Dec 03, 2004 8:44 am
- Location: spain
-
Contact:
Post
by cecilio » Tue Apr 15, 2008 8:42 am
What is the correct method to empty a vector of wxString pointers?
I'm trying this:
Code: Select all
std::vector<wxString*>::iterator it;
for (it = m_Labels.begin(); it != m_Labels.end(); ++it)
delete *it;
m_Labels.clear();
But I'm getting a run time error in the 'delete *it' instruction:
Debug Assert Fail. File dbgdel.cpp, Line 52.
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
The vector is valid, as well as the contained wxString pointers.
Thank you,
-
phlox81
- wxWorld Domination!

- Posts: 1387
- Joined: Thu Aug 18, 2005 7:49 pm
- Location: Germany
-
Contact:
Post
by phlox81 » Tue Apr 15, 2008 9:02 am
use the indexoperator delete vec;
Or take a look at the boost::pointercontainer library.
-
cecilio
- I live to help wx-kind

- Posts: 189
- Joined: Fri Dec 03, 2004 8:44 am
- Location: spain
-
Contact:
Post
by cecilio » Tue Apr 15, 2008 8:07 pm
Thank you. I don't understand anything about the behaviour of wxString*.
I tried
but it also fails with the same error.
I don't understand why it is failing.
Also, to use the stored strings I have to do
Code: Select all
wxString sText = (*it)->GetData();
and use &sText instead of using (*it) directly. Why this behavior? Is not (*it) a pointer to wxString?
Thank you.
-
phlox81
- wxWorld Domination!

- Posts: 1387
- Joined: Thu Aug 18, 2005 7:49 pm
- Location: Germany
-
Contact:
Post
by phlox81 » Tue Apr 15, 2008 8:53 pm
Why do you store Stringpointers at all?
A std::vector<wxString> would do the same.
-
S.Volkenandt
- Knows some wx things

- Posts: 26
- Joined: Tue Nov 14, 2006 1:51 pm
- Location: Duesseldorf, Germany
Post
by S.Volkenandt » Wed Apr 16, 2008 7:49 am
I suppose you double-delete those pointers, or the pointers stored in the vector are not allocated via new wxString.
-
cecilio
- I live to help wx-kind

- Posts: 189
- Joined: Fri Dec 03, 2004 8:44 am
- Location: spain
-
Contact:
Post
by cecilio » Wed Apr 16, 2008 2:25 pm
Thank you for the clues. They help me to focus on the problem. There were nothing wrong with wxString* or std::vector. It was just my fault.
I was storing pointers to temporary wxStrings, no longer existing when trying to use them. And also I cause a double delete of the strings:
Code: Select all
lmDlg dlg = new lmDlg(_("String"));
dlg->ShowModal();
lmDlg::lmDlg(const wxString& sText)
{
m_Labels.push_back(sText);
...
}
lmDlg::~lmDlg()
{
std::vector<wxString*>::iterator it;
for (it = m_Labels.begin(); it != m_Labels.end(); ++it)
delete *it;
m_Labels.clear();
}
Thank you.
-
eranif
- Moderator

- Posts: 607
- Joined: Tue Nov 29, 2005 7:10 pm
- Location: Israel
Post
by eranif » Wed Apr 16, 2008 5:21 pm
FYI,
You can always use wxArrayString
Eran
-
cecilio
- I live to help wx-kind

- Posts: 189
- Joined: Fri Dec 03, 2004 8:44 am
- Location: spain
-
Contact:
Post
by cecilio » Wed Apr 16, 2008 8:16 pm
You can always use wxArrayString
Yes, but I'm trying to avoid wxContainers when STL alternatives exist. Clearer code and more portable!
Regards,