ard.~Serial();
You should NEVER invoke the destructor directly. Delete the object, and the destructor will be called.
A static array will be faster, and there will be no question about whether the allocation succeeded. With malloc(), it is possible for the allocation to fail. You are not checking for that possibility.
A static array does not have to be freed, so there is no possibility of forgetting to free it, or of the code being revised to provide an alternate return path that bypasses the free() call (such as an exception be thrown).