mercredi 28 octobre 2015

std::vector allocation copy

I just stumbled into an issue with std::vector when adding new elements to it.

It seems when you try to add more elements to it, and it needs to allocate more space, it does so by copying the last element it currently holds. This seems to assume that any element in the vector is fully valid, and as such a copy will always succeed.

In our case, this is not necessarily true. Currently we might have some left over elements in the vector, because we chose not to remove them yet, which are valid objects, but their data doesn't guarantee valid behavior. The objects have guards, but I never considered adding guards to a copy constructor as I assumed we would never be copying an invalid object (which vector forces) :

CopiedClass::CopiedClass(const CopiedClass& other)
    : member(other.member)
{
    member->DoSomething();
}

It just so happened that "member" is nulled when we are done with the original object and leave it lying about in the vector, so when std::vector tries to copy it, it crashes.

Is it possible to prevent std::vector from copying that element? Or do we have to guard against possible invalid objects being copied? Ideally we'd like to keep assuming that only valid objects are created, but that seems to imply we immediately clean them from the vector, rather than waiting and doing it at some later stage.

Aucun commentaire:

Enregistrer un commentaire