I reviewed some lines of your code, I think that there are some problems
with Unicode conversion (for which I suggest CA2W from ATL) and with
dynamic allocations and delete not properly done.
You may want to try this code (I put my comments with a "@@" tag so you
can identify the corrections I proposed in your original code):
<code>
#include <iostream>
#include <vector>
#include <string>
// @@ use CA2W to convert from ANSI to Unicode
#include <atlbase.h>
#include <atlconv.h>
class Basis {
public:
Basis* pLeft; // I dont use, these pointers were also in the original
program where I got this exception.
Basis* pRight;
// @@ Clear pointers in default ctor
Basis()
: pLeft(NULL), pRight( NULL )
{
}
// @@ You are inheriting from this class, and storing pointers to
// this class in the vector container, so I would assign a virtual
// destructor to this class for proper cleanup
virtual ~Basis()
{
// Nothing to do here
}
};
class Test1 : public Basis {
public:
wchar_t cChar;
Test1(wchar_t c = L'\0') : cChar(c) {}
virtual ~Test1()
{
// Nothing to do here
}
};
int main(int argc, char* charv[])
{
// @@ I like typedef'ing templates
// std::vector<Basis*> vec;
typedef std::vector< Basis * > BasisPtrVector;
BasisPtrVector vec;
char buf[150];
std::string str;
std::wstring wstr;
do {
// @@ Better not hard-coding numbers for sizes - use sizeof()
// memset(buf,0,150);
memset( buf, 0, sizeof(buf) );
std::cout << "\nEnter: ";
std::getline(std::cin,str);
// @@ To convert from ANSI to Unicode, I would use ATL helper
classes:
CA2W unicodeString( str.c_str() );
// @@ Convert to STL wstring
wstr = std::wstring( unicodeString );
// @@ use ++it for better performance for iterators
// for (std::string::iterator it = str.begin(); it != str.end(); it++)
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
{
vec.push_back( new Test1(*it) );
}
for (BasisPtrVector::iterator it = vec.begin(); it !=
vec.end(); ++it)
{
// @@ This code is complicated... and the cast from wchar_t to
char is not good...
// std::cout << (char)( (Test1*)(*it))->cChar;
// Use wcout to send Unicode output...
std::wcout << ( static_cast<Test1 *>(*it) )->cChar;
}
std::cout << "\n";
// @@ You should erase *pointed objects* you allocated with new,
// before erasing the pointer values stored in the vector
// vec.erase(vec.begin(),vec.end());
for ( BasisPtrVector::iterator it = vec.begin(); it != vec.end();
++it )
{
delete *it;
}
// @@ now you can delete vector content (note that clear() method
erases all).
vec.clear();
} while (wstr != L"stop");
return 0;
}
</code>
HTH,
Giovanni
"Bas" <geenspam@danku.nl> ha scritto nel messaggio
news:48d766ef$0$27217$9a622dc7@news.kpnplanet.nl...
Hello all,
Im not sure, but I get some pretty strange results here.
When I run this program debug compiled but NOT in debug mode, or release
compiled
I get an exception, sometimes immediately, sometimes after some time.
If I run in debug mode, everything runs fine.
I THINK it has something to do with reallocating of the vector if its
capacity is too small.
If I replace all UNICODE stuff with "normal" characters, I don't have any
problem.
anyone the same experience? Or am I doing something wrong?
Bas from Holland
excerpt from memory.h:
void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
::operator delete(_Ptr); <---- here I get an
exception.
}
the program:
#include <iostream>
#include <vector>
#include <string>
class Basis {
public:
Basis* pLeft; // I dont use, these pointers were also in the original
program where I got this exception.
Basis* pRight;
};
class Test1 : public Basis {
public:
wchar_t cChar;
Test1(wchar_t c = L'\0') : cChar(c) {}
};
int main(int argc, char* charv[])
{
std::vector<Basis*> vec;
char buf[150];
std::string str;
std::wstring wstr;
do {
memset(buf,0,150);
std::cout << "\nEnter: ";
std::getline(std::cin,str);
// I use this to convert the "normal" string in a UNICODE string
size_t iConverted;
int strLengte = str.length();
wchar_t* pBuf = new wchar_t(strLengte +2);
memset(pBuf,0,strLengte + 3 );
mbstowcs_s(&iConverted,pBuf,str.length()+1,str.c_str(),_TRUNCATE);
wstr= std::wstring(pBuf);
for (std::string::iterator it = str.begin(); it != str.end();
it++)
{
vec.push_back(new Test1(*it));
}
for (std::vector<Basis*>::iterator it = vec.begin(); it !=
vec.end(); it++)
std::cout << (char)((Test1*)(*it))->cChar;
std::cout << "\n";
vec.erase(vec.begin(),vec.end());
} while (wstr != L"stop");
return 0;
}