Hi,
Global operator new and delete are overloaded and I am using stl map
to store pointers, but this code crashes, can some one shed some
light???
Compiler: MS VC++ 6.0
STL: Shipped with Visual Studio.
#include <malloc.h>
#include <map>
using namespace std;
typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
void* operator new(size_t size)
{
void * p = ::malloc(size);
gMemStore[p] = p;
return p;
}
void operator delete(void* p)
{
PointersMap::iterator it = gMemStore.find(p);
if(it != gMemStore.end())
gMemStore.erase(it);
::free(p);
}
int main(int argc, char* argv[])
{
return 0;
}
TIA.
-Paul. 12 2445
"Paul" <bg*****@yahoo.com> wrote in message
news:d8**************************@posting.google.c om... Hi,
Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes, can some one shed some light??? Compiler: MS VC++ 6.0 STL: Shipped with Visual Studio.
#include <malloc.h> #include <map>
using namespace std; typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
void* operator new(size_t size) { void * p = ::malloc(size); gMemStore[p] = p; return p; }
void operator delete(void* p) { PointersMap::iterator it = gMemStore.find(p); if(it != gMemStore.end()) gMemStore.erase(it); ::free(p); }
int main(int argc, char* argv[]) { return 0; }
Well, I could see how this might cause infinite recursion. Your operator
new calls std::map<void*,void*>::operator[] which could call operator new,
which calls std::map<void*,void*>::operator[], which could call operator
new, etc. That's just a guess, because I do not have VC++6. Have you
considered using a debugger? It would probably give you a more
straightforward answer than this newgroup.
--
David Hilsee
* Paul: Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes
That should read: and therefore this code crashes.
Try to search for "infinite recursion".
int main(int argc, char* argv[]) { return 0; }
This does not exercise the code and seems to serve no purpose.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
"Paul" <bg*****@yahoo.com> wrote in message
news:d8**************************@posting.google.c om... Hi,
Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes, can some one shed some light??? Compiler: MS VC++ 6.0 STL: Shipped with Visual Studio.
#include <malloc.h> #include <map>
using namespace std; typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
void* operator new(size_t size) { void * p = ::malloc(size); gMemStore[p] = p; return p; }
void operator delete(void* p) { PointersMap::iterator it = gMemStore.find(p); if(it != gMemStore.end()) gMemStore.erase(it); ::free(p); }
int main(int argc, char* argv[]) { return 0; }
TIA. -Paul.
Do you crash with an out of stack-space message ?
The problem is probably as others have said that gMemStore[p] calls new,
giving an infinite loop.
You could create your own namespace to fix it, so you could use f.ex.
app::new and app::delete for you own code.
PKH bg*****@yahoo.com (Paul) wrote in message news:<d8**************************@posting.google. com>... using namespace std; typedef map<void*,void*> PointersMap;
It will not solve the problem but
typedef set< void * > PointersMap;
would be more appropriate there IMHO. And there is erase method that
accepts key instead of iterator in std::map so you do not have to do
find/if/erase by yourself. al***@start.no (Alf P. Steinbach) wrote in message news:<41****************@news.individual.net>... * Paul: Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes That should read: and therefore this code crashes.
Hmm, your point is valid, debugged but there is no infinite recursion.
I am analyzing stack trace, 'll post the reason soon, it doesn't even
call new again. I need to find out why.
Try to search for "infinite recursion".
int main(int argc, char* argv[]) { return 0; }
This does not exercise the code and seems to serve no purpose.
I wanted to show here that I am allocating nothing, still new is
getting called and resulting in a crash. who is calling new and why?
well I see that C Runtime is calling this, but why? Hmm looks like, I
found some thing to learn.
-Paul.
Paul wrote: al***@start.no (Alf P. Steinbach) wrote in message news:<41****************@news.individual.net>... * Paul: Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes
That should read: and therefore this code crashes.
Hmm, your point is valid, debugged but there is no infinite recursion. I am analyzing stack trace, 'll post the reason soon, it doesn't even call new again. I need to find out why.
Try to search for "infinite recursion".
int main(int argc, char* argv[]) { return 0; }
This does not exercise the code and seems to serve no purpose.
I wanted to show here that I am allocating nothing, still new is getting called and resulting in a crash. who is calling new and why?
Q: Well. What does your program do?
A: It creates a PointersMap object.
Q: So what is a PointersMap object?
A: it is a std::map<void*,void*>
Q: Could it be that when a std::map object
comes into existance, that it allocates something?
A: Hmm. Nobody knows for sure, but chances are high that
it does.
Q: But what does that mean?
A: It means that the global operator new is called, which
in turn uses the PointersMap object (which by the way is
not constructed fully right now) and tries to insert a pointer
in the map. As a consequence if this insertion, the PointersMap
object will need to allocate some memory which results in a call
to the global operator new, which in turn tries to insert the
pointer, which results in a call to global operator new ....
--
Karl Heinz Buchegger kb******@gascad.at
"PKH" <no************@online.no> wrote in message news:<BO******************@news2.e.nsc.no>... "Paul" <bg*****@yahoo.com> wrote in message news:d8**************************@posting.google.c om... Hi,
Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes, can some one shed some light??? Compiler: MS VC++ 6.0 STL: Shipped with Visual Studio.
#include <malloc.h> #include <map>
using namespace std; typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
void* operator new(size_t size) { void * p = ::malloc(size); gMemStore[p] = p; return p; }
void operator delete(void* p) { PointersMap::iterator it = gMemStore.find(p); if(it != gMemStore.end()) gMemStore.erase(it); ::free(p); }
int main(int argc, char* argv[]) { return 0; }
TIA. -Paul. Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH
there is absolutely no recursion and hence no out-of stack message. It
crashes at first insert, I didn't see second insert or some sort of
recursion in stack trace.
interested people can have a look at this stack trace.
std::_Tree<void *,std::pair<void * const,void *>,std::map<void
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> ::_Parent(std::_Tree<void *,std::pair<void * const,void
*>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Node *
0x00000000) line 42
std::_Tree<void *,std::pair<void * const,void *>,std::map<void
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Root() line 550
std::_Tree<void *,std::pair<void * const,void *>,std::map<void
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::insert(const
std::pair<void * const,void *> & {...}) line 217 + 40 bytes
//****crash while it is unwinding****//
std::map<void *,void *,std::less<void *>,std::allocator<void *>::insert(const std::pair<void * const,void *> & {...}) line 96
std::pair<void * const,void *>::pair<void * const,void *>(void *
const & 0x002f1000, void * const & 0x00000000) line 21
std::map<void *,void *,std::less<void *>,std::allocator<void *>::operator[](void * const & 0x002f1000) line 93
operator new(unsigned int 24) line 17 + 14 bytes
std::_Allocate(int 24, char * 0x00000000) line 30 + 9 bytes
std::allocator<void *>::_Charalloc(unsigned int 24) line 62 + 11 bytes
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void
*,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void
*>,std::allocator<void *> >::_Buynode(std::_Tree<void *,std::pair<void
* const,void *>,std::map<void *,void *,std::less<void
*>,std::allocator<void *> >::_Kfn,std::less<void
*>,std::allocator<void *> >::_Node * 0x00000000, ...) line 578 + 10
bytes
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void
*,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void
*>,std::allocator<void *> >::_Init() line 450 + 62 bytes
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void
*,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void
*>,std::allocator<void *> >::_Tree<void *,std::pair<void * const,void
*>,std::map<void *,void *,std::less<void 1ee72c23(const std::less<void
*> & {...}, unsigned char 0, const std::allocator<void *> & {...})
line 160 + 67 bytes
std::map<void *,void *,std::less<void *>,std::allocator<void *>::map<void *,void *,std::less<void *>,std::allocator<void *> >(const
std::less<void *> & {...}, const std::allocator<void *> & {...}) line
57 + 47 bytes
$E3() line 12 + 42 bytes
$E6() + 29 bytes
_initterm(void (void)* * 0x0042a104 $S7, void (void)* * 0x0042a208
___xc_z) line 525
_cinit() line 192 + 15 bytes
mainCRTStartup() line 205
KERNEL32! 7c581af6()
The representation...
-e (d called e)
-d (c called d)
-c (a called c)
-b (a called b, b returned and then a called c)
-a
tia.
-Paul
"Paul" <bg*****@yahoo.com> wrote in message
news:d8**************************@posting.google.c om... "PKH" <no************@online.no> wrote in message
news:<BO******************@news2.e.nsc.no>... "Paul" <bg*****@yahoo.com> wrote in message news:d8**************************@posting.google.c om... Hi,
Global operator new and delete are overloaded and I am using stl map to store pointers, but this code crashes, can some one shed some light??? Compiler: MS VC++ 6.0 STL: Shipped with Visual Studio.
#include <malloc.h> #include <map>
using namespace std; typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
void* operator new(size_t size) { void * p = ::malloc(size); gMemStore[p] = p; return p; }
void operator delete(void* p) { PointersMap::iterator it = gMemStore.find(p); if(it != gMemStore.end()) gMemStore.erase(it); ::free(p); }
int main(int argc, char* argv[]) { return 0; }
TIA. -Paul.
Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH
there is absolutely no recursion and hence no out-of stack message. It crashes at first insert, I didn't see second insert or some sort of recursion in stack trace. interested people can have a look at this stack trace.
I ran it on a copy of MSVC++6 I have at work, and you're right, it did not
crash because of the recursion. However, there most certainly _is_
recursion, and it would have infinitely recursed if it had been able to
continue. It looked like it crashed because the std::map's constructor had
not finished executing, so it was in an invalid state when operator[] was
first called. The constructor would up invoking operator new, which invoked
operator[] on the partially-constructed std::map.
--
David Hilsee
* Paul: Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH there is absolutely no recursion
That is incorrect.
and hence no out-of stack message.
The conclusion wouldn't follow from the premise if the premise was true.
It crashes at first insert, I didn't see second insert or some sort of recursion in stack trace. interested people can have a look at this stack trace.
I and many others have already told you what the technical problem is.
It is recursion.
I've marked recursion below with "----------------- ^ -----------------".
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> ::_Parent(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000) line 42
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Root() line 550
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::insert(const std::pair<void * const,void *> & {...}) line 217 + 40 bytes //****crash while it is unwinding****//
std::map<void *,void *,std::less<void *>,std::allocator<void *>::insert(const std::pair<void * const,void *> & {...}) line 96
std::pair<void * const,void *>::pair<void * const,void *>(void * const & 0x002f1000, void * const & 0x00000000) line 21
std::map<void *,void *,std::less<void *>,std::allocator<void *>::operator[](void * const & 0x002f1000) line 93
----------------- ^ -----------------
operator new(unsigned int 24) line 17 + 14 bytes std::_Allocate(int 24, char * 0x00000000) line 30 + 9 bytes std::allocator<void *>::_Charalloc(unsigned int 24) line 62 + 11 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Buynode(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000, ...) line 578 + 10 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Init() line 450 + 62 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void 1ee72c23(const std::less<void *> & {...}, unsigned char 0, const std::allocator<void *> & {...}) line 160 + 67 bytes std::map<void *,void *,std::less<void *>,std::allocator<void *>::map<void *,void *,std::less<void *>,std::allocator<void *> >(const std::less<void *> & {...}, const std::allocator<void *> & {...}) line
Called from here.
57 + 47 bytes $E3() line 12 + 42 bytes $E6() + 29 bytes _initterm(void (void)* * 0x0042a104 $S7, void (void)* * 0x0042a208 ___xc_z) line 525 _cinit() line 192 + 15 bytes mainCRTStartup() line 205 KERNEL32! 7c581af6()
The representation... -e (d called e) -d (c called d) -c (a called c) -b (a called b, b returned and then a called c) -a
tia. -Paul
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail? al***@start.no (Alf P. Steinbach) wrote in message news:<41****************@news.individual.net>... * Paul: Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH there is absolutely no recursion
That is incorrect.
and hence no out-of stack message.
The conclusion wouldn't follow from the premise if the premise was true.
It crashes at first insert, I didn't see second insert or some sort of recursion in stack trace. interested people can have a look at this stack trace.
I and many others have already told you what the technical problem is.
It is recursion.
no its not, I agree this can cause recursion, but its not crashing due
to recursion. David Hilsee's response addresses it properly.
I modified the code to illustrate. this code'll not crash.
like David said, the construction is not complete.
It requests for memory - new allocates - but before returning the
pointer to allocated memory to map - it uses that memory - which is
why it crashes.
#include <malloc.h>
#include <map>
using namespace std;
typedef map<void*,void*> PointersMap;
PointersMap gMemStore;
bool bDone = false;
void* operator new(size_t size)
{
void * p = ::malloc(size);
if(bDone)
gMemStore[p] = p;
return p;
}
int main(int argc, char* argv[])
{
bDone = true;
// following line when un-commented, results a crash due to recursion.
// int *p = new int[10];
return 0;
}
thanks for your comments.
-Paul. I've marked recursion below with "----------------- ^ -----------------".
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> ::_Parent(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000) line 42
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Root() line 550
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::insert(const std::pair<void * const,void *> & {...}) line 217 + 40 bytes //****crash while it is unwinding****//
std::map<void *,void *,std::less<void *>,std::allocator<void *>::insert(const std::pair<void * const,void *> & {...}) line 96
std::pair<void * const,void *>::pair<void * const,void *>(void * const & 0x002f1000, void * const & 0x00000000) line 21
std::map<void *,void *,std::less<void *>,std::allocator<void *>::operator[](void * const & 0x002f1000) line 93
----------------- ^ -----------------
operator new(unsigned int 24) line 17 + 14 bytes std::_Allocate(int 24, char * 0x00000000) line 30 + 9 bytes std::allocator<void *>::_Charalloc(unsigned int 24) line 62 + 11 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Buynode(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000, ...) line 578 + 10 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Init() line 450 + 62 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void 1ee72c23(const std::less<void *> & {...}, unsigned char 0, const std::allocator<void *> & {...}) line 160 + 67 bytes std::map<void *,void *,std::less<void *>,std::allocator<void *>::map<void *,void *,std::less<void *>,std::allocator<void *> >(const std::less<void *> & {...}, const std::allocator<void *> & {...}) line
Called from here.
57 + 47 bytes $E3() line 12 + 42 bytes $E6() + 29 bytes _initterm(void (void)* * 0x0042a104 $S7, void (void)* * 0x0042a208 ___xc_z) line 525 _cinit() line 192 + 15 bytes mainCRTStartup() line 205 KERNEL32! 7c581af6()
The representation... -e (d called e) -d (c called d) -c (a called c) -b (a called b, b returned and then a called c) -a
tia. -Paul al***@start.no (Alf P. Steinbach) wrote in message news:<41****************@news.individual.net>... * Paul: Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH
there is absolutely no recursion
That is incorrect.
and hence no out-of stack message.
The conclusion wouldn't follow from the premise if the premise was true.
It crashes at first insert, I didn't see second insert or some sort of recursion in stack trace. interested people can have a look at this stack trace.
I and many others have already told you what the technical problem is.
It is recursion.
I've marked recursion below with "----------------- ^ -----------------".
*,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> ::_Parent(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000) line 42
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::_Root() line 550
std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *>::_Kfn,std::less<void *>,std::allocator<void *> >::insert(const std::pair<void * const,void *> & {...}) line 217 + 40 bytes //****crash while it is unwinding****//
std::map<void *,void *,std::less<void *>,std::allocator<void *>::insert(const std::pair<void * const,void *> & {...}) line 96
std::pair<void * const,void *>::pair<void * const,void *>(void * const & 0x002f1000, void * const & 0x00000000) line 21
std::map<void *,void *,std::less<void *>,std::allocator<void *>::operator[](void * const & 0x002f1000) line 93
----------------- ^ -----------------
operator new(unsigned int 24) line 17 + 14 bytes std::_Allocate(int 24, char * 0x00000000) line 30 + 9 bytes std::allocator<void *>::_Charalloc(unsigned int 24) line 62 + 11 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Buynode(std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Node * 0x00000000, ...) line 578 + 10 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Init() line 450 + 62 bytes std::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void *>,std::allocator<void *> >::_Kfn,std::less<void *>,std::allocator<void *> >::_Tree<void *,std::pair<void * const,void *>,std::map<void *,void *,std::less<void 1ee72c23(const std::less<void *> & {...}, unsigned char 0, const std::allocator<void *> & {...}) line 160 + 67 bytes std::map<void *,void *,std::less<void *>,std::allocator<void *>::map<void *,void *,std::less<void *>,std::allocator<void *> >(const std::less<void *> & {...}, const std::allocator<void *> & {...}) line
Called from here.
57 + 47 bytes $E3() line 12 + 42 bytes $E6() + 29 bytes _initterm(void (void)* * 0x0042a104 $S7, void (void)* * 0x0042a208 ___xc_z) line 525 _cinit() line 192 + 15 bytes mainCRTStartup() line 205 KERNEL32! 7c581af6()
The representation... -e (d called e) -d (c called d) -c (a called c) -b (a called b, b returned and then a called c) -a
tia. -Paul
you are correct on both counts, incomplete construction and possible
recursion. Recursion is possible, but this crashes before even it
reaches there, due to incomplete construction.
thanks
-Paul.
"David Hilsee" <da*************@yahoo.com> wrote in message news:<5t********************@comcast.com>... "Paul" <bg*****@yahoo.com> wrote in message news:d8**************************@posting.google.c om... "PKH" <no************@online.no> wrote in message news:<BO******************@news2.e.nsc.no>... "Paul" <bg*****@yahoo.com> wrote in message news:d8**************************@posting.google.c om... > Hi, > > Global operator new and delete are overloaded and I am using stl map > to store pointers, but this code crashes, can some one shed some > light??? > Compiler: MS VC++ 6.0 > STL: Shipped with Visual Studio. > > #include <malloc.h> > #include <map> > > using namespace std; > typedef map<void*,void*> PointersMap; > > PointersMap gMemStore; > > void* operator new(size_t size) > { > void * p = ::malloc(size); > gMemStore[p] = p; > return p; > } > > void operator delete(void* p) > { > PointersMap::iterator it = gMemStore.find(p); > if(it != gMemStore.end()) > gMemStore.erase(it); > ::free(p); > } > > int main(int argc, char* argv[]) > { > return 0; > } > > TIA. > -Paul.
Do you crash with an out of stack-space message ? The problem is probably as others have said that gMemStore[p] calls new, giving an infinite loop. You could create your own namespace to fix it, so you could use f.ex. app::new and app::delete for you own code.
PKH
there is absolutely no recursion and hence no out-of stack message. It crashes at first insert, I didn't see second insert or some sort of recursion in stack trace. interested people can have a look at this stack trace.
I ran it on a copy of MSVC++6 I have at work, and you're right, it did not crash because of the recursion. However, there most certainly _is_ recursion, and it would have infinitely recursed if it had been able to continue. It looked like it crashed because the std::map's constructor had not finished executing, so it was in an invalid state when operator[] was first called. The constructor would up invoking operator new, which invoked operator[] on the partially-constructed std::map.
you are correct on both counts, incomplete construction and possible
recursion. Recursion is possible, but this crashes before even it
reaches there, due to incomplete construction.
thanks
-Paul.
Pls. my second post under Alf P. Steinbach is a mistake, it should be here. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Martin Drautzburg |
last post by:
In the wx demoy TreeCtrl.py I find the following code, that should
have no effect but seems to be needed nevertheless.
class TestTreeCtrlPanel(wx.Panel):
def __init__(self, parent, log):
, isz)...
|
by: Max Christian |
last post by:
I'm writing a mixed-mode C++ DLL which is used by an old C++
application that I don't have the source code to. I'm amazed by the
ease of interoperability, but the one problem I'm having is...
|
by: RallyDSM |
last post by:
Pre STory - I've had a lot of problems with this program, and I just
added the last part of it (the add item code) and now an older part of
the program crashes.
Public Structure Stocks
Public...
|
by: Jeff |
last post by:
ASP.NET 2.0
This code crashes. It generate this error:
Value cannot be null.
Parameter name: type
I've created some custom web.config settings and this crash is related to
accessing theme...
|
by: linq936 |
last post by:
Hi,
It could be a very simple problem, but i can not see it...
Here is the code:
char* lower(char* str){
char* p = str;
while ( *str ) {
*str = tolower(*str); <=====crash!
str++;
|
by: bradhs |
last post by:
Hello,
Microsfot Access 2003 crashes constantly and randomly on Vista. I cant Compact and Repair, import into a new ADP file, etc... It crashes while opening a form, moving objects around in a...
|
by: Mohamed Mansour |
last post by:
Hey there, this will be somewhat a long post, but any response is
appreciated!
I have done many PInvoke in the past from C++ to C#, but I did PInvoke
within C# not C++/CLI.
Can someone explain...
|
by: ssndk123 |
last post by:
Hi,
Using the UserPort program that changes permissions in XP so that I am
able to write directly to the parallel port using assembler..
I'm trying to send out square wave pulses for x number...
|
by: jonpb |
last post by:
Using .NET 3.5, I need to pass an array of structs as parameter to a C++
unmanaged function.
The C++ dll stores some data in an unmanaged cache, the function writes
the values into the array of...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: Shællîpôpï 09 |
last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
| | |