I don't like that _write is responsible for cleanup. Generally it is best to keep the allocation and deallocation 'nearby'. It is unfortunate that we don't have std::vector<std::unique_ptr<>> to take care of this for us.

I'm also worried about OperationFailure exceptions and leaks.

I think you should create a class like this:

struct ScopedWriteOperations {
    ScopedWriteOperations() {}
    ~ScopedWriteOperations() {
       // delete all ops;
    }
    std::vector<WriteOperations*> ops;
};

Then, in each of these methods, start by declaring a ScopedWriteOperations object, and append any ops into its internal vector.