Re: [vox-tech] anything wrong with this code?
On Thu, May 27, 2010 at 08:48:06PM -0700, Bill Broadley wrote: > On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote: > > On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote: > >> hi there: > >> > >> can anyone look at these two small c++ snippets to see what's wrong > >> with them? I was interviewed with them... > > Out of curiosity, where? (feel free to not answer) > > >> 1. > >> A* createA(){ return new A();} > >> void fun(){createA();} > >> What's wrong with the above code? > > > > It leaks memory. Yeah, you know why the interviewer asked that? Either one of his employees or _he_ made the error and it started dropping memory on the floor, not to mention losing access to previously allocated variables. It looks like a nice tool for a little bit of nastiness though. Overwrite a variable, then later creatively drop into that memory location and get your stash back! > > Is A defined? Is it that A is allocated but the return value isn't > checked (for an allocation failure)? Or that the pointer isn't used? Or > that it leaks? -- Brian Lavender http://www.brie.com/brian/ "There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies." Professor C. A. R. Hoare The 1980 Turing award lecture ___ vox-tech mailing list vox-tech@lists.lugod.org http://lists.lugod.org/mailman/listinfo/vox-tech
Re: [vox-tech] anything wrong with this code?
Thanks all. it's Barcap in NYC. Hai On Thu, May 27, 2010 at 11:48 PM, Bill Broadley wrote: > On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote: >> On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote: >>> hi there: >>> >>> can anyone look at these two small c++ snippets to see what's wrong >>> with them? I was interviewed with them... > > Out of curiosity, where? (feel free to not answer) > >>> 1. >>> A* createA(){ return new A();} >>> void fun(){createA();} >>> What's wrong with the above code? >> >> It leaks memory. > > Is A defined? Is it that A is allocated but the return value isn't > checked (for an allocation failure)? Or that the pointer isn't used? Or > that it leaks? > >>> 2. >>> for(iter=map.begin();iter!=map.end();iter++){ >>> erase(iter++); >>> iter++; >>> } >>> anything wrong with the above code? What's happened for "iter++" internally? >> >> 1. erase() is a member function of the map class. It is not a free >> function. A free function named erase() wouldn't know what >> container to erase the iterator from. >> 2. The code only works if map.size() is a multiple of 3. If it >> isn't, then one of the iter++ operations may try to put iter 2 >> or 3 past the end of the map. If you did this on a raw array, or >> a vector (whose iterators are usually just pointers to the >> elements, unless you're in some kind of debug mode), >> * then the standard doesn't guarantee that you can form >> the address of the element 2 or 3 past the end of the >> array, >> * if you could form that address it would certainly no >> longer be equal to array.end(), so you'd miss the >> termination condition. > > While true, wouldn't it be simpler to just say that iter is incremented > 3 times per loop and it's likely that the intent is once? While legal > in C/C++, in general you shouldn't much with an iteration variable. > Either turn it into a while (without increment) and handle it in the > body, or increment in the for loop and don't muck with it in the body. > ___ > vox-tech mailing list > vox-tech@lists.lugod.org > http://lists.lugod.org/mailman/listinfo/vox-tech > ___ vox-tech mailing list vox-tech@lists.lugod.org http://lists.lugod.org/mailman/listinfo/vox-tech
Re: [vox-tech] anything wrong with this code?
On 05/27/2010 08:35 PM, Chanoch (Ken) Bloom wrote: > On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote: >> hi there: >> >> can anyone look at these two small c++ snippets to see what's wrong >> with them? I was interviewed with them... Out of curiosity, where? (feel free to not answer) >> 1. >> A* createA(){ return new A();} >> void fun(){createA();} >> What's wrong with the above code? > > It leaks memory. Is A defined? Is it that A is allocated but the return value isn't checked (for an allocation failure)? Or that the pointer isn't used? Or that it leaks? >> 2. >> for(iter=map.begin();iter!=map.end();iter++){ >> erase(iter++); >> iter++; >> } >> anything wrong with the above code? What's happened for "iter++" internally? > > 1. erase() is a member function of the map class. It is not a free > function. A free function named erase() wouldn't know what > container to erase the iterator from. > 2. The code only works if map.size() is a multiple of 3. If it > isn't, then one of the iter++ operations may try to put iter 2 > or 3 past the end of the map. If you did this on a raw array, or > a vector (whose iterators are usually just pointers to the > elements, unless you're in some kind of debug mode), >* then the standard doesn't guarantee that you can form > the address of the element 2 or 3 past the end of the > array, >* if you could form that address it would certainly no > longer be equal to array.end(), so you'd miss the > termination condition. While true, wouldn't it be simpler to just say that iter is incremented 3 times per loop and it's likely that the intent is once? While legal in C/C++, in general you shouldn't much with an iteration variable. Either turn it into a while (without increment) and handle it in the body, or increment in the for loop and don't muck with it in the body. ___ vox-tech mailing list vox-tech@lists.lugod.org http://lists.lugod.org/mailman/listinfo/vox-tech
Re: [vox-tech] anything wrong with this code?
On Thu, 2010-05-27 at 22:08 -0400, Hai Yi wrote: > hi there: > > can anyone look at these two small c++ snippets to see what's wrong > with them? I was interviewed with them... > > 1. > A* createA(){ return new A();} > void fun(){createA();} > What's wrong with the above code? It leaks memory. > 2. > for(iter=map.begin();iter!=map.end();iter++){ > erase(iter++); > iter++; > } > anything wrong with the above code? What's happened for "iter++" internally? 1. erase() is a member function of the map class. It is not a free function. A free function named erase() wouldn't know what container to erase the iterator from. 2. The code only works if map.size() is a multiple of 3. If it isn't, then one of the iter++ operations may try to put iter 2 or 3 past the end of the map. If you did this on a raw array, or a vector (whose iterators are usually just pointers to the elements, unless you're in some kind of debug mode), * then the standard doesn't guarantee that you can form the address of the element 2 or 3 past the end of the array, * if you could form that address it would certainly no longer be equal to array.end(), so you'd miss the termination condition. --Ken ___ vox-tech mailing list vox-tech@lists.lugod.org http://lists.lugod.org/mailman/listinfo/vox-tech