c++ - what to delete after assignment? -
if have:
template<> char *tobytes<uint64_t>(uint64_t src) { char *data = new char[8]; //...stuff return data; } template<> void write<uint64_t>(char *dst, uint64_t src) { char *srcbytes = tobytes(src); (int = 0; < 8; ++i) { *(dst++) = *(srcbytes++); //am leaking here? } }
that gets called like:
char *keyptr = new char[27]; //...stuff write(keyptr, 1234ull); //...write 27
if delete[] keyptr;
have deleted srcbytes? think question is, on line asking if i'm leaking, doing copy , result deleting keyptr
leaves srcbytes
still deleted?
still learning c++ , it's not clear me when copy constructor called vs assignment operator.
edit 1:
fixed delete per @steephen's answer
edit 2
add tobytes per @whozcraig's comment
you have memory leak. no, delete []
-ing keyptr
has nothing srcbytes
, independent allocation. 2 addressed buffers unrelated (except content due copy-code).
apart obvious (using std::vector<>
, letting raii take on memory management of this), minimal change code plug leak loop this:
template<> void write<uint64_t>(char *dst, uint64_t src) { char *srcbytes = tobytes(src); std::copy(srcbytes, srcbytes+8, dst); delete [] srcbytes; }
or using smart pointer:
template<> void write<uint64_t>(char *dst, uint64_t src) { std::unique_ptr<char[]> srcbytes(tobytes(src)); std::copy(srcbytes.get(), srcbytes.get()+8, dst); }
both use std::copy
stock algorithm both accomplishes seem want, while retaining original result of tobytes
proper cleanup. choose (or perhaps entirely different still) leave you.
best of luck.
Comments
Post a Comment