Let the container own the pixels
A vector owns its elements and manages its backing allocation. When the vector is destroyed, it destroys the elements and releases its storage. You do not pair it with delete[]. This is RAII: resource ownership lives in an object whose destructor performs cleanup when its lifetime ends normally or through exception unwinding.
Build ordinary application types out of members that already manage their resources. An image containing a vector does not need a handwritten destructor merely to imitate an older pointer-and-length design. This is the rule of zero. Returning such an image by value gives the caller an owned result; it is not returning a pointer into a vanished local array.
RAII helps with cleanup. It does not prove that an index is in bounds, that a borrowed view is still valid, or that another thread has finished reading. Those remain contracts you must understand and test.
Explain why Image needs no custom destructor. Then identify an invariant its public members do not enforce: could width and pixels.size() disagree?
