Да, вы правы. Более того, ваш код относится к типу «изо всех сил пытаясь понять его неправильно», поскольку vector
уже является динамическим контейнером, и у вас нет причин выполнять другое динамическое выделение для вашего элемента (просто оно скопировано).
Есть еще много способов облажаться. Ни одна из них не является специфической проблемой проектирования C ++, но есть просто предел тому, что язык может помешать вам делать. Еще несколько примеров:
int main(int argc, char **argv)
{
new double; // leak
delete static_cast<void*>(&argc); // doesn't belong to you
int a = *static_cast<int const *>(0x42); // not a valid pointer
{ T x; x.~T(); } // call destructor of non-existent object
{ T y; y.~T(); new (static_cast<void*>(&y) T(); }
// impossible to recover from exception in T::T()
}
К счастью, почти всегда очевидно, что вы делаете то, что не должны.