Dear Valeri You are right, in this example I forgot to add a temporary pointer. Usually, I do: char *opt = new char[csize]; char *del = opt; opt = strtok(strcpy(opt,options),":"); etc. delete [] del; I hope that this is correct. Best regards Christian Valeri Fine wrote: > Hello Christian, > > You STILL have a problem > The pointer your new operator returns > > char *opt = new char[csize]; > > and the pointer you want to use to delete that array MUST match > > However your statement > > >> opt = strtok(NULL, ":"); > > > does change the pointer "opt" and by this reason you can not make free > the memory allocated with the "new" > > > You can have avoid that if you use your "opt", "opt1", opt2" solely to > create and delete. Use other variables for all internal operations and > you will be safe (may be :-) > > Of course you may research some other ways like the STL "string" class > or Qt QString::section(. . .) to do what you want > http://doc.trolltech.com/3.3/qstring.html#section ) > > Best regards, Valeri > > >>Dear all >> >>Thank you all for giving me some more information. >> >>Sorrowly, Victor´s statement is really bad news. >>Is the following code allowed in other compilers: >> const Int_t kBufSize = 512; //in global space >> char option[kBufSize]; // in different functions >> >>To reply to Valeri: >>Suppose, I have the following code with the input: >> "options = "myopt1:myopt2" >> >> MyFunction(const char *option) >> { >> Int_t csize = strlen(options) + 1; >> char *opt = new char[csize]; >> char *opt1 = new char[csize]; >> char *opt2 = new char[csize]; >> >> opt = strtok(strcpy(opt, options),":"); >> opt1 = strcpy(opt1, opt); >> >> opt = strtok(NULL, ":"); >> opt2 = strcpy(opt2, opt); >> >> myClass->MyMethod(opt1, opt2) >> { >> fString1 = opt1; //TString fString1; >> fString2 = opt2; //TString fString2; >> } >> >> delete [] opt2; >> delete [] opt1; >> delete [] opt; >> } >>Is this code safe as long as I use TString and not char? >> >>BTW, this is the reason, why I always hated C which I >>have never used, and why I try to use the TString class >>whenever possible, :-) >> >>Best regards >>Christian >> >> >>Victor Perevoztchikov wrote: >> >> >>>In addition to Valery, construction >>> >>> >>>>> char option[csize]; >>> >>>allowed only in gcc. >>> >>>Victor >>> >>>Victor M. Perevoztchikov perev@bnl.gov >>>Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY > > 11973-5000 > >>>tel office : 631-344-7894; fax 631-344-4206; >>> >>>----- Original Message ----- >>>From: "Valeri Fine" <fine@bnl.gov> >>>To: "'cstrato'" <cstrato@aon.at>; "'Elias Athanasopoulos'" >>><elathan@phys.uoa.gr> >>>Cc: <roottalk@pcroot.cern.ch> >>>Sent: Sunday, June 06, 2004 5:47 PM >>>Subject: RE: [ROOT] compiler warning >>> >>> >>> >>> >>>>>Dear Elias, dear Valeri >>>>> >>>>>Thank you for your explanation. >>>>>I have now solved the problem by using: >>>>> Int_t csize = strlen(opt) + 1; >>>>> char option[csize]; >>>>> >>>> >>>>[Valeri Fine] >>>>Let me call your attention that your solution is still error prone >>>> >>>>You allocated the needed space on stack. >>>>This means the space will be automatically de-allocated and (it can > > be > >>>>allocated for other purpose) as soon as your code leaves the > > "option" > >>>>variable scope. Because you did not provide your source I have no > > clue > >>>>what this scope is. May be it is what you wanted . . . >>>> >>>> >>>> >>>>>I hope that this does not only work with gcc but also with >>>>>other compilers. >>>> >>>>[Valeri Fine] >>>>I hope thee smart compiler will warn as soon as you try using this >>>>variable out of scope, however the smart guy always can defeat any >>>>compiler :-) >>>> >>>>Hope this helps. >>>> >>>> >>>> >>>>>Best regards >>>>>Christian >>>>> >>>>> >>>>>Valeri Fine wrote: >>>>> >>>>> >>>>> >>>>>>Hello Christian >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>>Dear Rooters >>>>>>> >>>>>>>I apologize for a simple non-root question, but sorrowly I have >>>>>>>nobody else to ask: >>>>>>>Sometimes I have statements such as the following: >>>>>>> if (strcmp(name, "option") == 0) { >>>>>>> char *option; >>>>>>> option = strcpy(option, opt); >>>>>>> } >>>>>>> >>>>>>>Although it is correct, I get the following compiler warning: >>>>>>>"warning: `char*option' might be used uninitialized in this >>>> >>>>function" >>>> >>>> >>>>>>[Valeri Fine] It looks like the compiler pointed you to your bug > > to > >>>>be >>>> >>>> >>>>>>fixed. That must lead to the memory corruption. "strcpy" alone >>>>>>allocates NO extra memory. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>>How can I prevent such compiler warnings? >>>>>> >>>>>>[Valeri Fine] >>>>>> >>>>>> >>>>>> >>>>>>>Would it be save to write: >>>>>>> char *option = ""; >>>>>>>(If this is not save, why?) >>>>>> >>>>>>[Valeri Fine] >>>>>>Not it is NOT safe !!! >>>>>> >>>>>>To avoid the memory corruption you need >>>>>> >>>>>> char *option = new char[strlen(opt)+1]; >>>>>> >>>>>>or something like this to make sure the memory the POINTER > > "option" > >>>>>>points to is allocated and it is enough to accommodate the entire >>>> >>>>string >>>> >>>> >>>>>>pointed by "opt" pointer. >>>>>> >>>>>> Hope this helps. >>>>>> >>>>>> Valeri >>>>>> >>>>>> >>>>>> >>>>>>>Thank you in advance >>>>>>>Best regards >>>>>>>Christian >>>>>>>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- >>>>>>>C.h.r.i.s.t.i.a.n. .S.t.r.a.t.o.w.a >>>>>>>V.i.e.n.n.a. .A.u.s.t.r.i.a >>>>>>>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- >>>>>> >>>>>> >>>>>> >>>>>> >>> >>> > > > >
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:08 MET