이미 할당된 메모리에 대해 생성자를 명시적으로 호출하기 위한 new
// 새로운 메모리를 할당하고 객체 생성 (생성자 호출)
new Point(1,2);
// 이미 할당된 메모리(p)에 객체 생성 (생성자만 호출)
new(p) Point(1,2); // placement new
메모리 할당
operator new(sizeof(Point));생성자 호출
new(p) Point(1, 2); // placement new
std::construct_at(p, 1, 2); // C++20소멸자 호출
p->~Point();
std::destroy_at(p); // C++17메모리 해지
operator delete(p);
// Point 객체 3개를 힙에 연속적으로 생성하고 싶음
new Point[3]; // 디폴트 생성자가 없는 경우 에러 발생
C++11의 중괄호 표기법으로 생성 가능
new Point[3]{{0,0}, {0,0}, {0,0}};
하지만 수가 많을 수록 비효율적
메모리 할당과 생성자 호출을 분리하여 해결
Point* p2 = static_cast<Point*>(operator new(sizeof(Point) * 3));
for (int i = 0; i < 3; i++)
{
new(&p2[i]) Point(0, 0);
// std::construct_at(&p2[i], 0, 0);
}
for (int i = 0; i < 3; i++)
{
p2[i].~Point();
// std::destroy_at(&p2[i]);
}
operator delete(p2);
int main()
{
std::vector<int> v(10);
v.resize(7);
std::cout << v.size() << std::endl; // 7
std::cout << v.capacity() << std::endl; // 10
v.resize(8);
std::cout << v.size() << std::endl; // 8
std::cout << v.capacity() << std::endl; // 10
}
vector의 크기를 줄일 경우 실제 메모리를 줄이지 않고 size 값만 변경
struct X
{
X() { std::cout << "X() get resource" << std::endl;}
~X() { std::cout << "~X() release resource" << std::endl;}
};
int main()
{
std::vector<X> v(10);
v.resize(7); // 소멸자 3번 호출
v.resize(8); // 생성자 1번 호출
}
메모리의 할당/해지는 발생하지 않지만,
줄어든 객체의 소멸자와 늘어난 객체의 생성자는 명시적으로 호출