|
I have a static instance of a class that basically handles memory allocation for a certain module. This way when the application quits this destructor will handle freeing memory for the whole module. An alternative would be to call an 'exit' type function in this module to do a similar thing.
As this is a static object, the constructor and destructor get called before and after calling 'main()'. However in the main() function just before we return, we call our own CheckMemory function that checks all allocated memory has been freed (we also have out own new & delete functions for this). As the memory in my module is not freed until the destructor we get a few warnings.
Any ideas as to how to fix this?
I am considering putting the CheckMemory() into it's own class and call the check in the destructor but how can we guarantee when each destructor will be called?
Is there a Visual C++ 'work around' for this problem?
Thanks
Kris
|
|
|
|
|
C++ does not guarentee any particular order of static initialization across compilation units (different .cpp s in plain English). But there's a nifty trick to ensure that a given static constructor is executed the first in your program, and hence its destructor is called the very last:
class memory_checker
{
memory_checker();
~memory_checker()
{
CheckMemory();
}
public:
static void launch()
{
static memory_checker mc;
}
};
struct memory_checker_laucher
{
memory_checker_laucher()
{
memory_check::launch();
}
};
static memory_checker_launcher mcl__; Now, if you #include "memorycheck.h" at the beginning of every .cpp of your program, you will get CheckMemory to be called when everybody else has left the party.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Hi everybody,
Perhaps a simple question but, i would like to suggest it o you:
In my application, i have an "access violation" message which appear to this following line:
*(pHistoDBNorm+ j- *(pInflex+i)- *pInflex), when i=0 and j=16, just with this indications, you will tell me to check if th e allocation is well done, but the problem is if i remove *(pInflex+i)- *pInflex (which is equal to 0), in the debug window, the following
*(pHistoDBNorm+ j) is evaluated correctly whereas
*(pHistoDBNorm+ j- *(pInflex+i)- *pInflex), always in the debug window couldn't be evaluated (instead of reading a value which would have to be the same than *(pHistoDBNorm+ j), i could read something like that:"expression couldn't be read..."
why??????
thanks in advance
gerald
|
|
|
|
|
All clues suggest that pInflex is invalid. Maybe you have freed it before time?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
i'm not sure because i have tested at the same time and both *pInflex and *(pInflex+i) have a correct value (equal to 0). i have seen it in the debug window!
|
|
|
|
|
Wait! There's a typo in your expression, instead of
*(pHistoDBNorm+ j- *(pInflex+i)- *pInflex) it should be
*(pHistoDBNorm+ j- <font color=#ff0000>(</font>*(pInflex+i)- *pInflex<font color=#ff0000>)</font>)
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
you're right, sorry for this stupid mistake and thanks for your help
|
|
|
|
|
Sorry just a little mistake in my answer: "both *pInflex and *(pInflex+i) have a correct value (equal to 15)", not really important i know, but..!
|
|
|
|
|
Hi Folks I'm pretty new to this ao any help would be very much appreciated. I'm building a Dialog based application which carries out some maths on the user input.
Would anyone be able to give me a simple example of how to drag an Icon within a defined rectangle in a Dialog based application? I need to be able to monitor the x,y position of the Icon. I think I need to use WM_LBUTTONDOWN and WM_LBUTTONUP messages but I'm not sure of the easiest way to do it.
I'm using Windows 98 and Visual C++ 6
Thanks in advance
Damien
|
|
|
|
|
hi..
how to use WM_MOUSEHOVER,I have not seen more example about this message.
I am using Win32api,not mfc.
I want to get button's text when mouse cursor on button.not push or select.
please help!!!
|
|
|
|
|
I think you can make WM_MOUSEMOVE Work. and jast say GetWindowFromPoint().check for the class name of button..and then GetwindowText..what do you say?
|
|
|
|
|
Sorry WindowFromPoint and not the GetWindowFromPoint
|
|
|
|
|
hi vikrams...
thanks for your reply..
I have a new problem.this program is working when cursor on window but not working for button or any controls.
have you got any suggestion?
|
|
|
|
|
Can you paste the Code snippet here,that you are using ?
|
|
|
|
|
Hi...
My code is follow:
case WM_MOUSEMOVE:
GetCursorPos(&pt);
hControl=WindowFromPoint(pt);
GetWindowText(hControl,str,30);
if(hControl==GetDlgItem(hWnd,IDOK))
MessageBox(hWnd,str," ",0);
else if(hControl==hWnd)
MessageBox(hWnd,str,"",0);
return TRUE;
|
|
|
|
|
Hello, I am writing a very small function to display the status of my application. Every time I get a new status I want to change to a new line and display it, that's why Status+="\r\n" is there. But strangely the program doesn't change to new line, instead, it display a "II" so all my message are showing in the same line.
Can someone help me to figure out the problem?
Many thanks in advance,
void CAPIDlg::DisplayStatus(CString aCString){
Status+=aCString;
Status+="\r\n";
m_Status.SetWindowText(Status);
}
aCS
|
|
|
|
|
Make sure the control has the mutiline style (if it's an EDIT), or neither the "centered" nor "simple" style (if it's a STATIC).
If you go to war, you will destroy a great country a stoned greek chick to the richest man of the world
[sighist] | [Agile Programming] [doxygen]
|
|
|
|
|
You see the ASCII Output of "\r\n".
Check that your control is multiline enabled.
Try Status.Format( %s\r\n", aCString )
Try this @ home. (B&B)
|
|
|
|
|
Ya! I adjust the mutiline option and it works fine now Thanks!
|
|
|
|
|
some windows controls use \n only and some use \r\n, try just using \n alone, that might fix your problem, although the fact that it displays II means it isn't understand either \r nor \n, so you may be out of luck, try to figure out some other way of using newlines i guess.
|
|
|
|
|
What is _T("") used for? I see it a lot....
Thanks.
nds
|
|
|
|
|
The _T macro cares for proper encoding of the text (argument). Subject to your compiler preferences _T("zorro") will result in a simple character string "zorro", or in the Unicode equivalent "zorro"L, or in a MBCS encoding.
To prepare for I8N, you should use the _T macro to embrace all text constants, only use the "T" types (TCHAR, LPTSTR, LPCTSTR), and "T" functions ("_tcscmp", etc). Also, you should stop using Format or Printf-like functions but prefer the arkward FormatMessage() functions instead.
Of course, all this only matters if you use MSDEV, and if I8N is a (potential) issue for you.
Bernd
|
|
|
|
|
Sorry about my ignorance, but what is I8N?
|
|
|
|
|
Ooops... Should have been I18N, short for internatialization (the letter I, 18 other characters, then the letter N).
Bernd
|
|
|
|
|
Make build compatible between UNICODE, ANSI and MBCS.
Basically, in an Unicode build, you want all "normal" string constants to be Unicode (wchar_t *), and in an ANSI build, all of them to be ANSI (char *).
A UNICODE string constant is indicated by an L : L"Hello" is a UNICODE Hello (independent of UNICODE or ANSI build)
_T("Hello") evaluates to "Hello" in ANSI builds, and L"Hello" in UNICODE builds.
If you go to war, you will destroy a great country a stoned greek chick to the richest man of the world
[sighist] | [Agile Programming] [doxygen]
|
|
|
|