use C++ placement-new feature to save consuming, placement-new can separate mallocing from constructing.