C++
Beginner
1 min read
Dynamic Allocation: new, delete, and Placement new
Example
#include <iostream>
#include <new> // std::nothrow, placement new
#include <cstdlib> // std::malloc, std::free
struct Widget {
Widget(int id) : id_(id) {
std::cout << "Widget(" << id_ << ") constructed\n";
}
~Widget() {
std::cout << "Widget(" << id_ << ") destroyed\n";
}
int id_;
};
int main() {
// Scalar new/delete
Widget* w = new Widget(1);
delete w;
// Array new/delete
Widget* arr = new Widget[3]{2, 3, 4};
delete[] arr; // must use delete[], not delete
// nothrow: returns nullptr instead of throwing
Widget* big = new (std::nothrow) Widget(5);
if (!big) {
std::cout << "Allocation failed\n";
} else {
delete big;
}
// Placement new: construct into pre-allocated buffer
alignas(Widget) unsigned char buf[sizeof(Widget)];
Widget* pw = new (buf) Widget(99); // no heap allocation
std::cout << "Placed widget id: " << pw->id_ << "\n";
pw->~Widget(); // explicit destructor — do NOT delete pw
// Alignment query
std::cout << "alignof(Widget) = " << alignof(Widget) << "\n";
std::cout << "sizeof(Widget) = " << sizeof(Widget) << "\n";
return 0;
}