If you want, you can create new array, copy values you need from old array and delete old array. However in your case it will actually waste memory: I doubt those 16 bytes will be ever allocated again. And if you need to add values, you will need to reallocate array again, when in logical/physical size approach you will have some kind of buffer memory you can use before you have to reallocate.
Consider using vectors:
1 2 3 4 5 6 7
std::vector<int> v {1, 2, 3, 2, 1}; //Create vector
std::cout << v.size() << '\n'; //No need to remember actual size. Vector knows it itself
v.erase(std::remove(v.begin(), v.end(), 2), v.end()); //Erase-remove idiom
for(int i = 0; i != v.size(); ++i )
std::cout << v[i] << ' ';
std::cout << '\n' << v.size() << '\n';
v.shrink_to_fit(); //If you so concious about those several bytes of memory.