Yes, you need to clear the buffer and draw it according to sprite positions for each frame.
Excuse me, but are you certain about that?. I mean first of all that sounds terrible performance wise, and second as far as i know the chip8 draw rutine is only called when a DXYN type opcode is called so that would mean Keeping the vector/display array alive until the next update + XOR of Old display array vs new display array comes ( signaled by another DXYN opcode)
My workflow is
Wait for a DXYN opcode and decode it
Get N = Number of Lines for the sprite to draw
With a known N fill an Sprite Array starting at memory memory[I + 0] to [I + N]
Get X = V[regX] = Starting pos X of the sprite
Get Y = Y[regY] = Starting pos Y of the sprite
Set a draw flag as true and call the draw function
Then you mask and shift against the desired bit position and store it in your display array, repeat for every line of the sprite, XOR the whole display against the last time the display array was shown
I hope this clears up your doubt and helps you keep going

if you need anything I´m also coding a chip8 emulator in c++ and SDL and I´m currently doing input calls and debuging why the hell the counter on pong refuses to go Up xD
Have fun