I've got a class and I'm trying to return it's instance, but the destructor is called before I can return it, which and when it really does fall out of scope in a later functions it's destructor is called again and causes a break. I edited it to fix the error, but I was wondering if it's supposed to be calling it's destructor.
CBuffer BufferReader::read(const int size){
    const auto raw = read_raw(); 
    skip(size);
    return CBuffer(raw, size, true);
    // Dstructor is called in this example
    CBuffer out(read_raw(), size, true);
    skip(size);
    return std::move(out);
}
                You are returning a copy of the CBuffer. The original CBuffer that was created inside the function is destroyed when the function exits -- at least logically. Typically a compiler will elide the copy as an optimization unless that optimization is disabled (by making a debug build, for example).
Using std::move doesn't really change this.  The copy that is created can just be done more efficiently by stealing the guts out of the original CBuffer.  The original CBuffer still has to be destroyed, it just may not contain any real data.  A move constructor always needs to leave the original object in a valid state, so it can be safely destroyed.
For example:
struct CBuffer {
    char* data;
    CBuffer(CBuffer&& original)
       : data(original.data)
    {
        original.data = nullptr;
    }
    ~CBuffer() { delete [] data; }  // data may be null, but that is fine
                                    // delete will not do anything in that case.
};
If you can use std::vector instead, that is even better, since it handles these details for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With