yes this is true. Lame excuse is that It was beyond the scope of this simple example typed here (ie I've been lazy as typing in the browser).
What would be the suggestion if the number of legs or joints was dynamic ?
Rule R11 can be discussed as the instance does belong to a resource that can call delete.
side not regarding your code:
Isn't that going to invoke a copy & delete that is not necessary
which should be visible if you add an explicit copy constructor to the Joint class
Joint(const Joint &j) {Serial.print("Duplicating Joint "); Serial.println(number = j.number);}
I would suggest to do
Leg(int j1, int j2, int j3)
: joint1(j1), joint2(j2), joint3(j3) {
instead