I am not sure if I should be using delete [], at the end of main.
I am creating new dynamic object with use of new, but this is stored in an array.
Should I be using delete, should i delete each object created (for example in the loop and then use delete?) or delete should not be used here?
or, to explain that a little more, bk isnt a pointer, its an array that contains pointers. Each pointer inside bk needs a delete if it was allocated with new.
This construct is a little clunky. You already capped your allowed size to 100, why not just have
bk = book[100];
and have done with it? You can track how many you have the same way so you don't access into book farther than you have used it, that is unchanged.
The memory you are "saving" by not allocating them until needed is tiny, and the extra pointers introduce potential for bugs and aggravations.
And a vector would be great for handling this, growing to whatever size you need on demand AND getting rid of the need for pointers.
I think its important to learn pointers and how to do what you are doing, but in this code segment, the pointers serve no useful purpose.