|
Just to expand on the other reply...
To tidy up after new , use delete , or for an array use delete [] .
To tidy up after malloc , use free . Malloc is fine for allocating chunks of memory, but not for objects. (It doesn't call the constructor).
Imagine you have two friends, Bob and Frank.
devvy: Bob, please give me your favourite screwdriver.
Bob: Ok, here you go. Please give it back when you're done with it.
... devvy puts up his shelves ...
devvy: Here you go Frank, have your screwdriver back.
Frank: Eek, I don't have a screwdriver, you're messing with my mind man!
Frank: I don't know what to do with this! It clashes with my other stuff! I'm depressed! Now where did I put that sharp object...
Here endeth the lesson.
Iain.
|
|
|
|
|
Iain Clarke wrote: Imagine you have two friends, Bob and Frank.
devvy: Bob, please give me your favourite screwdriver.
Bob: Ok, here you go. Please give it back when you're done with it.
... devvy puts up his shelves ...
devvy: Here you go Frank, have your screwdriver back.
Frank: Eek, I don't have a screwdriver, you're messing with my mind man!
Frank: I don't know what to do with this! It clashes with my other stuff! I'm depressed! Now where did I put that sharp object...
Iain Clarke wrote: after new, use delete
mmm...I was thinking the same
Russell
|
|
|
|
|
I tried:
(a) "new" with "delete"
and
(b) "free" with "malloc"
Still crashing the very same way... and besides I think I'm already doing this.
Do you mean?
<br />
char * pszBuffer = NULL;<br />
pszBuffer = new char[10];<br />
delete [] pszBuffer; << deleting array?<br />
pszBuffer = NULL;<br />
|
|
|
|
|
Yes, if you do
XXXX *pX = new XXXX [n];
then you should get rid of it with
delete [] pX
Try the above code with:
class XXXX
{
public:
XXXX ()
{
TRACE0("XXXX Constructed\n");
}
~XXXX ()
{
TRACE0("XXXX Destructed\n");
}
};
main ()
{
XXXX *pX = new XXXX [4];
delete pX;
XXXX *pX = new XXXX [4];
delete [] pX;
}
In answer to your main question...
It appears that you have memory allocated from within the DLL, and freed from within the EXE. This is another example of using different memory buckets, and can lead to difficulties. While I haven't been bitten by this myself, either I'm lucky, or careful. I didn't think new / delete suffered from this problem like malloc & free, but I could be wrong.
There are a number of ways to deal with this... For an object, you could use a Release () method, and get it to delete itself - and the code for that would be in the same dll as the creation.
For chunks of memory, windows has a bunch of LocalAllocs, GlobalAllocs, which point to the same functions under Win32 I think.
Or look at the IMalloc interface for allocating / freeing memory.
Good luck,
Iain.
|
|
|
|
|
|
You are missing the point, devvvy. You have two problems:
a) the new/delete pairing, which you said you've fixed (original post was new/free pairing which is not correct).
b) the actual location of the new/delete pairing - this is causing the CRASH.
devvvy wrote:
I tried:
(a) "new" with "delete"
and
(b) "free" with "malloc"
Still crashing the very same way... and besides I think I'm already doing this.
You are pairing new with free(), not with delete, so you need to make the change.
However, you need to use the correct pairing (new & delete) in the same routine.
Your logic:
Create a new buffer in main();
Free buffer in main(); // Works okay
Create a new buffer in the DLL;
Free that buffer outside of the DLL, in the main program; // Crashes
You can't do that because the main program and the DLL have different heaps. The main program does not have access to the DLL's heap, so the pointer is invalid upon return to main.
Either create the 2nd buffer in main and also pass the 2nd buffer to NullTerminateString, or add a new method to the CUtilities class that deletes pszResult when you are done with it.
Reread the comments on the _CrtIsValidHeapPointer() before the _ASSERTE(). That describes your problem exactly.
devvvy wrote: /*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
<br />
It is difficult to tell the intended purpose of NullTerminateString(). The logic (use of string.size()) and variable names (pszData) both indicate the input is already a null-terminated string, but my brain says that you actually want to add a null to a non-null-terminated string. Not clear...<br />
<br />
I assume the purpose of NullTerminateString() is therefore to add a second null to the end of an already null-terminated string, because the routine fails if char * pszData is not already null terminated. (It can't determine proper size at string.size().)<br />
<br />
<br />
<blockquote class="FQ"><div class="FQA">devvvy wrote:</div>ch = pszBuffer[5]; // Should be '\0'<br />
free(pszBuffer); << LOCATION2: CRASH Here!<br />
</blockquote><br />
<br />
Note: pszBuffer[5] WILL BE NULL even without calling NullTerminateString()!<br />
Set szBuffer1 to 'a','b','c','d','e','f','g','h','i','j' and watch things go crazy.<br />
Gary
|
|
|
|
|
Thanks - I did take care not to allocate and disallocate memory from different dll... howeever, may be I missed certain places the trouble remains.
Advised by another developer, I changed some of the methods to take "const string &" as supposed to just "string" - after which the problem persists when debugged under Visual Studio 6. And the problem disappeared when debugged under Visual Studio 2005...
passing by value invokes "temporaries", and destructor won't work properly for these temporaries when passed across dll boundaries? But still why it crashed with VS6 and not VS2005??
baffling!!
I can send you the code if you are willing to look at it. Thanks!
devy
|
|
|
|
|
The computer I am using havn't been installed MSDN.I want to know that how to use CreatePolygonRgn(CONST POINT*,int,int).Could somebody send the information about the function in MSDN?Thank you.
And is the function PtInRgn exist?I want to use the both function to judge if a point in a polygon region.
Thanks for your help.
|
|
|
|
|
If you can access the Internet, you can go to http://msdn.microsoft.com
|
|
|
|
|
|
Strangely enough if you google createpolygonrgn the first listed linkage is TADA[^]
|
|
|
|
|
Did you ever realize that if you want to find help for a function on MSDN, it is much more efficient to use google than the MSDN search ?
|
|
|
|
|
hey, MSDN site has been refactored, and i find it very very much powerful by now !
|
|
|
|
|
I only have the modem connection and google is quicker, MSDN takes at least a minute to load, the same again to return the list of linkages.
|
|
|
|
|
toxcct wrote: very very much powerful by now
But Speed the same na?
|
|
|
|
|
Cedric Moonen wrote: Did you ever realize that if you want to find help for a function on MSDN, it is much more efficient to use google than the MSDN search
You are right. I used to do so..
|
|
|
|
|
please help me to develope registry cleaner for window xp
|
|
|
|
|
do you want us to write the code for you ?
or you're stuck on a particular point ?
please ask a specific question !
|
|
|
|
|
it depends on what you want to do, to clean.
to access to the registry there are many functions in the form Reg****Key , as RegOpenKeyEx , RegCloseKey , RegDeleteKey , RegSetValueEx , ...
Russell
|
|
|
|
|
Write to me. I accept paypal.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->ßRÅhmmÃ<-·´¯`·.
|
|
|
|
|
brahmma wrote: Write to me. I accept paypal
classic...
me accept payment in kind (if his GF is correct enough) :->
|
|
|
|
|
I'm imagining you in a dark street, holding up a sign...
"Will code for nookie!"
Iain.
|
|
|
|
|
I am currently working on an asset register as a project and would like to acquire information on the hardware as well as software installed on a host
Can anyone help!!
Kim
|
|
|
|
|
kim007 wrote: I am currently working on an asset register as a project and would like to acquire information on the hardware as well as software installed on a host
Sounds fun. Good luck.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|