|
trinadh_t wrote: but i dont hav NT service in my pc. I hav windows 2000 professional in my PC
2000 is nothing just advance version of NT.... Please read that article... that contain readymade solution for your need
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
Hi
Does anyone know how to use the SHChangeNotifyRegister API in a service.
|
|
|
|
|
Hope this helps...
http://www.codeproject.com/shell/shchangenotifyregister.asp[^]
Happy christmas friends. May the Love of My Lord and Saviour Jesus bring forth Joy and Happiness into your life too.
<marquee direction="up" height="50" scrolldelay="1" step="1" scrollamount="1" hspace="2" vspace="2">
--Owner Drawn
--Nothing special
--Defeat is temporary but surrender is permanent
--Never say quits
--Jesus is Lord
|
|
|
|
|
I have created a charater pointer which points to
a string . I need to copy an existing string in the
char pointer i created so i did this
In my class the code is as
char *m_FileName;<br />
m_FileName=new char[strlen(FileName)]; <br />
strcpy(m_FileName,FileName);
In the destructor of the class
<br />
~Class_temp()<br />
{<br />
if(m_FileName!=NULL)<br />
delete []m_FileName;<br />
}
I get a error at the delete keyword ,
Damage After normal Block 0x00000034
am i wrong some where
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
|
This won't work coz it's an array of memory.
Happy christmas friends. May the Love of My Lord and Saviour Jesus bring forth Joy and Happiness into your life too.
<marquee direction="up" height="50" scrolldelay="1" step="1" scrollamount="1" hspace="2" vspace="2">
--Owner Drawn
--Nothing special
--Defeat is temporary but surrender is permanent
--Never say quits
--Jesus is Lord
|
|
|
|
|
When using new[] you MUST always use delete[] , no matter if you allocate an array of char.
|
|
|
|
|
FileName is a zero-terminated string and strlen returns the number of charachters WITHOUT counting the '\0' char. When you allocate your new string, you need to allocate for one extra character otherwise when you make the copy, the ending zero will be written outside the boudaries of your allocated memory.
Instead of
m_FileName=new char[strlen(FileName)];
Write:
m_FileName=new char[strlen(FileName)+1];
|
|
|
|
|
You should allocate space for one more character than the length of the string:
m_FileName = new char[strlen(FileName)+1];
Also you should initialize m_FileName to NULL in the constructor:
m_FileName = NULL;
this is this.
|
|
|
|
|
Yeh i initialised
m_FileName = NULL;
but thanks for the suggestion that i should
add one more memory space for termination
charater .
But it dont work to solve my problem
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
Hello,
After the modification of the +1, your code should work. Are you modifying the string elsewhere?
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
Also either call
memset(m_FileName,0,(strlen(FileName)+1));
after the new,
or call
m_FileName[strlen(FileName)] = '/0';
after strcpy.
These sort of issues are commonly caused by the program not seeing the end of the string and it overruns it's buffer.
Another possible issue is if you are assigning a pointer to that string elsewhere that is still using it. Check the debugger to ensure anything that needs to reference the string stored in m_FileName after it's deleted has made it's own copy.
eg. code like this is BAD
class MyClass
{
private:
char* mystring;
public:
void SetMyString(const char* const newstring) { mystring = newstring; }
};
void somefunction()
{
MyClass mc;
const char* conststring = "test me"
char* addstring = new char*[strlen(conststring)+1];
memset(addstring, 0, strlen(conststring)+1); // strlen(conststring)+1 could be assigned to an integer
strcpy(addstring, conststring);
mc.SetMyString(addstring);
delete[] addstring; // BAD - because mc now contains an invalid pointer!!!!!
}
-- modified at 3:12 Thursday 22nd December, 2005
|
|
|
|
|
lastgen wrote: Also either call
memset(m_FileName,0,(strlen(FileName)+1));
after the new,
or call
m_FileName[strlen(FileName)] = '/0';
after strcpy.
Nope. strcpy will copy the terminating zero so you don't need to do it yourself.
|
|
|
|
|
OK, I didn't think it did. I've been programming for about 20 years but not a lot of C until recently
|
|
|
|
|
Cedric Moonen wrote: Nope. strcpy will copy the terminating zero so you don't need to do it yourself.
Cedric, actual problem is that.. vikas is allocating memroy many time and deleting memory only one time... let me explain that by small example...
class MemLeak
{
char *pFile;
public:
void allocatemem()
{
pFile=new char[100];
}
~MemLeak()
{
if(pFile)
delete []pFile;
}
};
In this case it will work fine
MemLeak a;
a.allocatemem() ;
and on destruction 100 byte will deleted so no Memory leak, but let me consider a another case
MemLeak a;
a.allocatemem() ;
a.allocatemem() ;
so on destruction only 100 byte is freed so there is memory leak. i believe vikas can code something like this
class MemLeak
{
char *pFile;
public:
MemLeak()
{
pFile=NULL;
}
void allocatemem()
{
if(pFile)
delete [] pFile;
pFile=new char[100];
}
~MemLeak()
{
if(pFile)
delete []pFile;
}
};
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
We don't know if he allocates the memory several times or not. But something that is sure is that this is not the source of the crash: allocating several times memory without freeing it lead to memory leaks but it won't crashes for sure. So the problem must be somewhere else...
But still, your suggestion is good: memory leaks are a bad programming practice
|
|
|
|
|
Cedric Moonen wrote: But still, your suggestion is good: memory leaks are a bad programming practice
You are Right (as Always).. But i believe original author never mention there is crash , here is original comment from vikas :-
I get a error at the delete keyword ,
Damage After normal Block 0x00000034
am i wrong some where
this type of error/message usually occur when there is memroy leak...
[ot] anyways... Hows your Xmas prepartion going on.... Marry Xmas
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
ThatsAlok wrote: this type of error/message usually occur when there is memroy leak...
Nopem this type of error occur when the pointer of your array has been corrupted (there are some bytes in front of your data that contains information about your array, such as the size and things like that, and these bytes are being overwritten). This may come because you write outside the bounds of the memory that is just before your array.
ThatsAlok wrote: Hows your Xmas prepartion going on.... Marry Xmas
Lot of things to do during these holidays (visiting families and things like that). Merry Christmas to you also !
|
|
|
|
|
Cedric Moonen wrote: this type of error occur when the pointer of your array has been corrupted (there are some bytes in front of your data that contains information about your array, such as the size and things like that, and these bytes are being overwritten).
It seems its very rare error.... could you give me some example relating to same
Cedric Moonen wrote:
Lot of things to do during these holidays (visiting families and things like that). Merry Christmas to you also !
yeap thanks
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
If I remember correctly (not sure anymore), this can happen when for example int this case:
class MyClass<br />
{<br />
char Temp1[10];<br />
char Temp2[10];<br />
}
And then, you copy something that is bigger than 10 char in the Temp1 array. Not sure that this will generate the error each time, you have to check it
|
|
|
|
|
Well, I maintain that the message observed Damage After normal Block 0x00000034 is usually encountered when you overwrite a guard byte at the end of an allocated memory block. Internally, the memory pool manager reserves a 'few' extra bytes at the end of an allocation because these stupid c-string off by one errors are so F_____G common. So, when you go to free the memory, the memory pool manager code checks the guard bytes to see if the values have change (yes, he over wrote one of them with a zero) and it issue a warning.
No shirt, no shoes, no brains, no service.
|
|
|
|
|
No , i am not allocating the memory
many times i have just done it once
its not the cause
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
vikas amin wrote: many times i have just done it once
ohh, in that case why don't you use CString or stl::string class... is there any problem using them
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
vikas amin wrote: In my class the code is as
char *m_FileName;
m_FileName=new char[strlen(FileName)];
strcpy(m_FileName,FileName);
are you calling this code in Constructor or some where else... You have delete memory every time you allocate it.. it seems you allocating memory many times but deallocating only one time, at time of destruction.
better use CString class instead of new
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
ThatsAlok wrote: are you calling this code in Constructor or some where else... You have delete memory every time you allocate it.. it seems you allocating memory many times but deallocating only one time, at time of destruction.
Good point using the example code I gave earlier the fix would be to add this to the MyClass class
//constructor
MyClass() { mystring = NULL; } // could also create a constructor that assigns the string
~MyClass() { if (mystring) delete[] mystring; }
SetMyString(const char* const newString)
{
if (mystring) delete[] mystring;
mystring = new char*[strlen(newString)+1];
strcpy(mystring, newString);
}
|
|
|
|