|
i tried this code
CString strLoad;<br />
strLoad.LoadString(IDS_PROJECT);<br />
LPTSTR lpsz = new TCHAR[strLoad.GetLength()+1];<br />
CHECK_FOR_NULL(lpsz)<br />
_tcscpy(lpsz,strLoad);
In Debug mode, while the function exits i get the memory leak for the new operator
Priya Sundar
|
|
|
|
|
Priya_Sundar wrote: CString strLoad;
strLoad.LoadString(IDS_PROJECT);
LPTSTR lpsz = new TCHAR[strLoad.GetLength()+1];
CHECK_FOR_NULL(lpsz)
_tcscpy(lpsz,strLoad);
I could found three ways to avoid mem leak
#1 callee itself provide the memory, and you function just to the copying task!
#2 you manually delete the memory when use of variable ends.
#3 Create the datastructure of vector or list , which contain pointer to all allocated memory and when program exit, delete all the memory pointed in vector!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
char* CNewDialog::ConvertResIdToChar(UINT uResString)
{
CString strTemp ;
char str[MAX_SIZE] ;
strTemp.LoadString(uResString) ;
strcpy( str , strTemp.GetBuffer(strTemp.GetLength()) ) ;
return &str[0] ;
}
|
|
|
|
|
Using this function also i am not able to fill up the table correctly.
All the methods convert fine. i.e if i give a AfxMessageBox(str);, i am able to get the correct string displayed.
I think the problem is in the method of passing or in the method of initialization of the structure.
Priya Sundar
|
|
|
|
|
This is just plainly wrong. You are returning a pointer to something that is local to the function and that will be destroyed when the function goes out of scope.
The problem is that it is a very insidous bug because it will probably work but once you change something somewhere in your code, bang, you'll get a crash.
|
|
|
|
|
Okay People.....
THANKS FOR ALL YOUR COMMENTS AND SUGGESTIONS...
Finally i landed up in something like this..
hLPSTR pMyLpstr;<br />
<br />
pMyLpstr = NULL;<br />
<br />
char* CNewDialog::ConvertResIdToChar(UINT uResString)<br />
{<br />
CString strLoad; <br />
strLoad.LoadString(nResString); <br />
pMyLpstr = new TCHAR[strLoad.GetLength()+1]; <br />
CHECK_FOR_NULL(pMyLpstr)<br />
_tcscpy(pMyLpstr,strLoad); <br />
return pMyLpstr;<br />
}<br />
<br />
delete [] pMyLpstr;<br />
pMyLpstr = NULL;<br />
This is based on a idea given by Nelek in some other thread.
Priya Sundar
|
|
|
|
|
just want to be sure, is this function call only once for each ID!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Yes, For every string ID i call this function for the required conversion. I am deallocating the memory only last in the destructor.
This gave me no memory leak warnings in the debug window, however, logically i am deallocating it only once at the last.. what about the memory allocated for the remaining strings...
I dont know why such memory leaks are not identified by the editor..
Hope what i am talking is correct!
Priya Sundar
|
|
|
|
|
please confirm me,
#1 There is separate variable for each function request for StringID
#2 How many times this function is called for same String ID.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
ThatsAlok wrote: #1 There is separate variable for each function request for StringID
There is no any separate variable. And i have large no of strings in the resource, using which i need to fill up my structre(which you can see in the code snippet). So to retrieve those from the string table, i need to convert the stringid.
ThatsAlok wrote: #2 How many times this function is called for same String ID.
Only once, so as to convert it and fill up the table strTagName variable value in the structure.
Priya Sundar
|
|
|
|
|
This just looks SO bad. I'm not really sure what will happen but I suspect that it has potential for the Coding Horrors forum.
When the NamesTable[] array is initialised, each NameInfo::strTagName pointer will be set to pMyLpstr , there will be no copying / storage of the string you obtained from the resource.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
Your "solution" is all wrong. If ConvertResIdToChar() is called 10 times, yet CNewDialog 's destructor is only called once, you can see there is going to be an obvious (9x) memory leak.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Priya_Sundar wrote: char* strTagName;
Does this member have to be a char* , or can it be a CString object?
Another solution might be:
struct NAME_INFO
{
char* strTagName;
BOOL bAlwaysCreate;
NAME_INFO(int nID, BOOL bCreate)
{
CString str;
str.LoadString(nID);
strTagName = new char[str.GetLength() + 1];
strcpy(strTagName, str);
bAlwaysCreate = bCreate;
}
};
CArray<NAME_INFO*, NAME_INFO*> NamesTable;
NamesTable.Add(new NAME_INFO(IDS_PRIYA, true));
NamesTable.Add(new NAME_INFO(IDS_NISHA, true));
NamesTable.Add(new NAME_INFO(IDS_RAM, true));
NamesTable.Add(new NAME_INFO(IDS_RAJ, true));
NamesTable.Add(new NAME_INFO(IDS_RAHUL, true));
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
<br />
NamesTable.Add(new NAME_INFO(IDS_PRIYA, true));<br />
NamesTable.Add(new NAME_INFO(IDS_NISHA, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAM, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAJ, true));<br />
NamesTable.Add(new NAME_INFO(IDS_RAHUL, true));<br />
Thankyou.
But what about deallocating the memory allocated using the new operator here?? Where should i have to deallocate that?
And in case i declare it(strTagName) as CString object, then i am not able to directly initialize values for them, as i have this structure as a global one. I get the error as:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _TAGS_INFO' No constructor could take the source type, or constructor overload resolution was ambiguous
So for convenience i put it as char*.
Priya Sundar
|
|
|
|
|
Priya_Sundar wrote: And in case i declare it(strTagName) as CString object, then i am not able to directly initialize values for them, as i have this structure as a global one. I get the error as:
error C2440: 'initializing' : cannot convert from 'class CString' to 'struct _TAGS_INFO' No constructor could take the source type, or constructor overload resolution was ambiguous
So for convenience i put it as char*.
struct NAME_INFO
{
CString strTagName;
BOOL bAlwaysCreate;
NAME_INFO(int nID, BOOL bCreate)
{
strTagName.LoadString(nID);
bAlwaysCreate = bCreate;
}
};
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi. I am beginner in MFC. I have a trouble about design multi forms.
I have design app in VB, create a multiforms with MDI, but when I tried to figure it out in VC 2005. I got a lot of confuse.
Can someone tell me about how to create it.
Thanks.
|
|
|
|
|
Why you dont make multiform in the VC++?
|
|
|
|
|
I want to. But how? I only know to open new/different form by using button OnFileNew.
Is there a way to create like VB?
Thanks for quick response.
|
|
|
|
|
|
I had tried "A multi document tabbed" before, but the demo showed open file using OnFileNew.
It's not like in VB so I can't used it.
The "Creation of Multiple Views", seems more promising. But I have a problem when I uses class that derived from CFormView. I can't call function create.
m_pNewForm->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, clientRect,&m_tabCtrl, ID_VIEW_BASE + idNewForm)
The error is "'Create' : function does not take 6 parameters"
I don't get it.
|
|
|
|
|
Take a view here[^]
there I explain how I create a structure of 1 doc, 1 main view (CScrollView) and from 1 to 50 CFormViews (one per element) with just 5 different templates
I used VC++ 6.0, so you may have to change some things to adapt to VS2003, but the principles are there
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
“The First Rule of Program Optimization: Don't do it. The Second Rule of Program Optimization (for experts only!): Don't do it yet.” - Michael A. Jackson
|
|
|
|
|
I need to find out the serial number of Compact Flash card plugged in to the computer via IDE in XP embedded environment. I am using Visual studio 2003 with .Net 1.1. COuld some body help me please?
|
|
|
|
|
maybe someone of the .net forum?
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
“The First Rule of Program Optimization: Don't do it. The Second Rule of Program Optimization (for experts only!): Don't do it yet.” - Michael A. Jackson
|
|
|
|
|
You could try WMI but most CF cards don't have a serial number, let alone a unique serial number. To use WMI, the creator of your XPe image will have to include the WMI component.
Judy
|
|
|
|
|
Hi.
There is trouble with List box (CListBox in MFC). I'm need horizontal scroll on CListBox object.
There is checkbox "Horizontal scroll" in properties of list box. I turn it on, but scroll doesn't appear. Is there way to create list box with horizontal scroll bar? Is't possible? Every information will be very valuable.
|
|
|
|