|
according to this[^] :
"Returns a reference to the object that is associated with a particular key. If the map does not already contain such an object, operator[] inserts the default object data_type()"
and
"Note that the definition of operator[] is extremely simple: m[k] is equivalent to (*((m.insert(value_type(k, data_type()))).first)).second"
It will create a new Apple and insert it at that key "position"; so it will always succeed and return a valid object.
Use std::map::find instead.
This signature was proudly tested on animals.
|
|
|
|
|
I will use that if I am unsure, does it run in the same time as the [] look up?
Thanks!!!!
|
|
|
|
|
it runs in the same time as the insert.
This signature was proudly tested on animals.
|
|
|
|
|
Hi there guys
new to code project and new to doxygen
i have some errors in doxygen that i need help with
Hi folks
i am kind of new to doxygen and i have encoutnered a few errors i would like
help with. I have managed to create a .chm file from my c++ source code. My
first problem arises with my file names. It has stripped the whole path name
and used that as the file name. I only want to single file name. I opened up
the configuration file and tried to change the STRIP_FROM_INC_PATH = to be
left blank. I know it has something to do with FULL_PATH_NAMES ,
STRIP_FROM_PATH, STRIP_FROM_INC_PATH but i have tried to change these with
no effect to my .chm file. Can anyone please help me with this. I tried to
post an image on this messageboard showing what i was talking about but it
refused so whoever replies and needs more explanation can give me there
email and i shall send the picture to them.
|
|
|
|
|
I'm debugging a Microsoft Visual C++ 2003 SDI/MFC windows app I have created. My app is using a 3rd party C++ library(DLL) for CAN msg communication. When my app starts it calls a 3rd party lib API which creats a new thread for handling CAN comm msg handling. The problem right now is that after many hours of running the app crashes with unhandled exception 0x7c90120e : user breakpoint. In the debugger output window it shows:
HEAP: Free Heap block 0x3f4e60 modified at 0x3f4e88 after it was freed.
I believe the 3rd party thread is attempting to access memory that was previously deallocated. The call stack looks like this:
ntdll.dll!7c90120e()
ntdll.dll!7c96e139()
.
.
kernel32.dll!7c80b7d0()
The threads window shows:
2024 WinMain guGetRxDataFrame <- my app function
=>2140 Win32 Thread 7c90120e <- this thread my by lib code
1) I believe the app is crashing because of the 3rd party lib
thread based on the debug info I provided above. Is my
understanding correct ? Also my code is not doing new/delete
operations but the lib code is.
2) I have access to the 3rd party lib code and have been
reviewing this "steaming pile" of poorly written code.
In it they are doing set_new_handler to install a user
function that is called when new operation fails. In the user
function they are doing throw std::bad_alloc(). I have added
try/catch(... ) in my code. In a multiple thread application
if the child thread crashes or throws an exceptoin how can my
parent thread "trap" the exception ? Is this possible ? I would like to do this so I can execute one of my user function to do some cleanup before exiting the app by installing a handler with set_terminate. I know this won't fix the root cause but I need to handle these kind of errors in my app anyways.
3) Is is possible to add a user function like set_new_handler() for the delete [] operation ? The 3rd party lib code is doing a new operation when executing a class constructor. They don't even check if the new operation was successful. Then in the class destructor they are doing a delete [] operation without even checking of the memory pointer in not NULL !!! crazy code, extremely bad. For example
4) If the child thread is leaking memory is there a way I can call function periodically to dump info to the debug window to see if memory is being chewed up over time such as CrtDumpMemoryLeaks() ?
Will setting up a time to execute CrtDumpMemoryLeaks() provide any useful info ?
Baga::Baga()
{
m_buffer = new dgUint8[MAXGFRAME];
m_framelen = sizeof( struct gframehdr );
m_gframehdr = (struct gframehdr *) m_buffer;
}
Baga::~Baga()
{
delete[] m_buffer; <- shouldn't they be check that
m_buffer is not NULL before attempting
this operation ????
}
I wish I could compile/link in the 3rd party lib code but I cannot.
This is my first debug of a multi-thread app. Need help in trying to figure out the root cause of this issue. Any other things I can try to help diagnose this problem ? Sorry, complex problem, so long email
These problems suck but I have already learned so much from this forum and the web in trying to attack this problem.
|
|
|
|
|
CodeMacDaddy wrote: I believe the app is crashing because of the 3rd party lib
thread
It seems that way, if you are certain that you've surrounded your calls to the DLL with try/catch(...) blocks and you are not doing any new/delete stuff.
This seems to be your main problem if I understand your description correctly and unfortunately it also seems like you cannot do anything about it if you're not able to build the DLL.
CodeMacDaddy wrote: I have access to the 3rd party lib code and have been
reviewing this "steaming pile" of poorly written code.
I can understand that you get frustrated during this tedious work trying to understand how it works, how it is suppose to work and why it doesn't.
However, it may not be as "poorly written" as you may think.
E.g. it's pointless to check if a memory allocation using new was successful in an exception-enabled application since if it fails it will throw an exception. Furthermore it's perfectly legal to call delete with a NULL pointer.
CodeMacDaddy wrote: In a multiple thread application
if the child thread crashes or throws an exceptoin how can my
parent thread "trap" the exception ? Is this possible ?
No, as far as I know it's not possible since exceptions are thrown within their context. So you won't be able to catch an exception thrown in a thread that is created inside your third-party DLL.
As for the root cause of your problem I can only guess, but I would bet some money on a race condition.
It's quite possible that the worker thread inside the DLL reads incoming messages and puts them in a buffer (m_buffer ?). For some reason the connection should be closed down, the Baga object destroyed and the receiving thread should be terminated. If the shutdown sequence doesn't wait for the worker thread to finish, the buffer may be freed before the thread exits. The thread may then try to write to the buffer which has already been freed in the call chain of the shutdown sequence.
Be aware that I'm only guessing, but the above is a common mistake.
When your application comes to this halt, try and find something in the call stack for each thread that makes sense instead of simple addresses. It may help you to figure out what has been executed and what the root cause of your problem is.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Hi Roger, thank you for your insight
1) As for you guess as to what is going on that is what I am
suspecting also but since I cannot access the thread info, I
cannot provide more debug info to the 3rd party lib provided.
I've made a stripped down project which I'm sending to the 3rd
party
2) Unfortunately, the call stack is not providing any "really"
useful info
3) I agree with your point "it's pointless to check if a memory allocation using new was successful in an exception-enabled application since if it fails it will throw an exception". My issue is that the exception-enabled is being down for the worker thread only. My app is using classes and APIs provided in the lib that don't do this. So I have to do try/catch around new class objects of the lib and/or install set_new_handler in my app also
|
|
|
|
|
CodeMacDaddy wrote: 2) Unfortunately, the call stack is not providing any "really"
useful info
Well, that should be fairly easy to fix; the library must have been debug built, otherwise you would not get the assertion about the heap. Debug built usually also means that you get a program database file (.pdb) as well which is used when populating the call stack with proper function names and such. You need to make sure that VS can find it such as putting it in the directory you're running your application in. But it might be that you haven't got the pdb-file delivered from the third party.
However, I find it a little bit odd that the DLL is debug built...
As I understand it, in order to fix your problem you have to be able to build the DLL. If you already have the source code for it, that shouldn't be too hard.
One way could be to create a new DLL project in VS and exchange the files created by the wizard with the files you got from the third party.
It may not work as my recommendation is based on a couple of assumptions, but it's a possible way forward that probably should be considered.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Yes, the 3rd party lib provider only provides .dll and .lib file no .pdb file unfortunately. And yes there is a debug and release version of the .dll / .lib file when linked into my code. I have the source of the lib code to be able to built for an embedded linux platform and put the .lib file on the linux platform so I can run my app. I don't have the Microsoft project / makefile to build the DLL for the PC side otherwise I would be able to do this and further debug their source My project has been send the 3rd party hommies, so they can help debug this issue.
|
|
|
|
|
if you have the 3rd party code fix it!!! And done.
So you can work on with your project...
Press F1 for help or google it.
Greetings from Germany
|
|
|
|
|
If only it was that simple
|
|
|
|
|
Hi,
I have a MDI app with multiple document templates added in it. So there is a hierarchy of document, view and framewindow classes such that a view, document and framewnd classes are associated through a templates.
Now, there are date-wise files for each document type, i.e for a particular date, there are as many files as there are doc types. Opening a document opens it in a child window
What I want to implement is to add a drop down list to the child window which will list the other document types for that date. Selecting a different doc type from drop down should
1. Close the existing document open in the child window
2. Open the new doc of selected type for current date in the existing child window and NOT in a new child window.
I want to know if this is possible and how to go about it. I am getting confused because I am not able to figure out how this will work because I am trying to retain the old child window, which is of a particular framewnd class and open a totally new document type in this window, with which it is not associated through any doc template.
Hope I have explained my problem. Any inputs will be highly appreciated.
Thanks in advance.
Abhi
|
|
|
|
|
Hello,
Please i need a help.
I'm totally new to CORBA.
Actually, i want to communicate between 2 different applications, (written in c++),
using CORBA.
the platform of the server is windows.
Is it possible to do this communication?
if yes, is there a sample program that can help me?
Thank you in advance for you help,
Solange.
|
|
|
|
|
|
with COM?
That's mean with TCP socket?
I can't use CORBA to communicate between the applications?
|
|
|
|
|
COM(Component object modal) is one the best way to achieve inter process communication.
This is a microsoft technology for inter process communication( basically it work with RPC(remote procedure call) mechanism)
refer
http://msdn.microsoft.com/en-us/library/ms877981.aspx[^]
If u go more futuristic then Windows Communication Foundation(WCF) is another microsoft technology in .NET
I think COM is suited for your need.
CORBA is not that easy
Величие не Бога может быть недооценена.
modified on Thursday, August 20, 2009 8:46 AM
|
|
|
|
|
You are kidding right ?
I mean, you really think that somebody can explain you Corba in a simple forum reply ?
I didn't mean to sound offending, but it's just that Corba is extremly complex and there's no way you will be able to learn it just by having somebody explain a couple of things. If you really want to go on with Corba (which I'm not really sure is the best option), then I would suggest that you buy a book about it.
If you are open to other alternatives, then I suggest you describe a bit more in details what you are trying to achieve, because communicating between two applications can mean a lot of different things.
|
|
|
|
|
Thank you for your quick reply.
Actually, I have a main application, and 3 other applications.
When the main application receive a incoming call, it will test the option of the receiving stack,
and it will call the correponding application, by sending to it some parameters.
Actually, im searching for the more performing solution.
Thank you for your help,
Regards.
|
|
|
|
|
Are the applications on the same machine or different machines ?
What you have to know about Corba, is that it is used to expose objects (classes) to other applications. This way, from another application, you can access objects that are hosted in your application.
If you have to exchange data (and not really access an object from another application) between the two applications, then I would rather go for something like sockets or shared memory (a standard IPC mechanism).
|
|
|
|
|
Yes the applications are in the same machine.
and i have to send data from an application to another.
Note:
The applications are for phone calls, that's why i'm searching for the best and quick solution.
Thank you again for your time.
|
|
|
|
|
And the applications are written in the same language ?
From what you are saying, I'm really not sure that Corba is the better solution (but I also only have very limited information, so I might be wrong). You said that it is for phone calls, does it mean that you will need to transfer call data (for instance SMS, or digital data, ...) between the applications ?
Anyway, I suggest you take a look at the "Inter-process communication" section[^] here on CP:
|
|
|
|
|
I will write the applications in the same language, (i want to use C++).
Actually, the phone call that i will receive, contain options in it's stack (for exple: it's a fax call).
So i will call the application dedicated to the fax process, and i will send to this application some parameters (like the incoming phone number,...)
|
|
|
|
|
sounds almost like you need to consider something like ICE .. www.zeroc.com/[^]
'g'
|
|
|
|
|
A popular (and free) C++ CORBA implementation is TAO[^].
But I agree with previous posters - CORBA is a complex subject and you should really get a book, such as this one[^]. Good luck.
|
|
|
|
|
A previous response indicated that your applications are on the same machine. If so, then use shared memory queue. This will give you the best performance, the easiest code to write and debug and none of the headaches of CORBA or COM (or TCP/Named Pipes/etc.)
|
|
|
|