Re: CreateObject confused
Hi Joe, I think I understand what you guys are saying so I will
leave it at that, albeit still leaving voids in my obsessive curiosity.
However I have a question on a separate thread (same code area).
I have reposted the below pertinant code for reference. Please
see question at bottom. (obviously I am doing something wrong)
--------------------------------------------------
class CFileHandlingDoc : public CDocument
{
protected: // create from serialization only
CFileHandlingDoc();
DECLARE_DYNCREATE(CFileHandlingDoc)
// Attributes
public:
CMapStringToString ExpMap1; // is serializable
CMapStringToString* pExpMap1;
.......
}
--------------------------------------------------
In the view class data gets put in the map, here
I have just plugged in some recognizable stuff,
(code crunched up to save posting space)
CFileHandlingDoc* DocPtr = GetDocument();
CString One, Two, Three;
One = _T("WWW"); Two = _T("ZZZZ"); Three = _T("DDDD");
DocPtr->ExpMap1.SetAt(_T("a"), One);
DocPtr->ExpMap1.SetAt(_T("b"), Two);
DocPtr->ExpMap1.SetAt(_T("c"), Three);
//so my map now has some stuff in it.
----------And the doc serialize function------------------
void CFileHandlingDoc::Serialize(CArchive& ar)
{
pExpMap1 = &ExpMap1;
if (ar.IsStoring())
{
ar << pExpMap1;
}
else
{
ar >> pExpMap1;
}
}
===================================
When I run the above serialized code I get the below msg from my
debug output window,
---I first write the file then read the file then exit app and see output---
Warning: CFile::GetStatus() returns m_attribute without high-order flags.
// I always get the above warning, never been able to decipher why, (this
// is still using my old VC 6 compiler, probably need to just leave it alone
// and use my 2005 ide )
// But the below leak, I only get with the above serialize code. When
// I change the serialize code to an alternate method (see below) I do
// not get memory leaks.
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {333} normal block at 0x019074E0, 17 bytes long.
Data: < DDDD> 01 00 00 00 04 00 00 00 04 00 00 00 44 44 44 44
strcore.cpp(118) : {332} normal block at 0x01907488, 14 bytes long.
Data: < c > 01 00 00 00 01 00 00 00 01 00 00 00 63 00
strcore.cpp(118) : {331} normal block at 0x01907430, 17 bytes long.
Data: < ZZZZ> 01 00 00 00 04 00 00 00 04 00 00 00 5A 5A 5A 5A
strcore.cpp(118) : {330} normal block at 0x01907160, 14 bytes long.
Data: < b > 01 00 00 00 01 00 00 00 01 00 00 00 62 00
strcore.cpp(118) : {328} normal block at 0x01907380, 16 bytes long.
Data: < WWW > 01 00 00 00 03 00 00 00 03 00 00 00 57 57 57 00
strcore.cpp(118) : {327} normal block at 0x01907328, 14 bytes long.
Data: < a > 01 00 00 00 01 00 00 00 01 00 00 00 61 00
plex.cpp(31) : {326} normal block at 0x01907240, 164 bytes long.
Data: < 4s > 00 00 00 00 00 00 00 00 0C 00 00 00 34 73 90 01
map_ss.cpp(74) : {325} normal block at 0x019071B8, 68 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
map_ss.cpp(394) : {322} client block at 0x019070B0, subtype 0, 28 bytes long.
a CMapStringToString object at $019070B0, 28 bytes long
Object dump complete.
The thread 0x334 has exited with code 0 (0x0).
The thread 0x134 has exited with code 0 (0x0).
The thread 0xE60 has exited with code 0 (0x0).
The program 'Z:\.........\FileHandling.exe' has exited with code 0 (0x0).
---------now I change "only" the serialize code (shown above) to this-----
void CFileHandlingDoc::Serialize(CArchive& ar)
{
// Write OR ReadClass CmStS's CRuntime data
ar.SerializeClass(RUNTIME_CLASS(CMapStringToString));
// Then call CmStS's serialize directly
ExpMap1.Serialize(ar);
if (ar.IsStoring())
{
}
else
{
}
}
----first write the file then read the file then exit app then output---
// I no longer get the memory leaks.
Warning: CFile::GetStatus() returns m_attribute without high-order flags.
The thread 0x498 has exited with code 0 (0x0).
The thread 0xEE4 has exited with code 0 (0x0).
The thread 0xB04 has exited with code 0 (0x0).
The program 'Z:\.........\FileHandling.exe' has exited with code 0 (0x0).
--------------------------------------------------------
// When I step thru the code (not that it is relevant, just my morbid
// curiosity) with this method I do not see the
pOb = pClassRef->CreateObject();
// being called, in fact it seems to skip ReadObject all together and
// just go from WriteClass to
CRuntimeClass* PASCAL CRuntimeClass::Load(CArchive& ar,
UINT* pwSchemaNum)
// and loads the runtime class description, which to me (down
// in my low foo bar knowledge) seems what I would think it would
// be doing.
// I think maybe as Goran had told me some time back that
// using the SerializeClass function is the safer method to use.