new vs malloc
멀티 환경 설정
공통적으로 런타임에 힙에서 메모리를 할당해주는 함수
C에서는 malloc을 사용하였지만, C++에서는 new를 사용하게 되었음
void *malloc(
size_t size
);
원하는 크기의 메모리를(byte) 직접 입력하고, 해당 메모리만큼을 할당받아 void*로 반환. 리턴실패시 NULL 반환
사실 메모리 할당 시, Alignment 및 메모리 유지관리 정보때문에 요청한 size보다 더 큰 메모리를 할당해줌
따라서 void*로 할당받으면, 사용할 포인터자료형으로 캐스팅하여 안전하게 사용
할당 시 메모리만 제공해주고 초기화나 생성자 호출같은 작업은 없음
calloc은 0으로 초기화해주긴 함
메모리 해제 시에는 free(ptr)을 사용하고 소멸자 이런거 없이 해제만 해줌
메모리 해제하면, OS는 남은 영역을 병합하여 다시 할당 가능한 메모리 풀로 복원하고 이후에 다시 할당
할당된 메모리의 크기를 realloc로 조정도 가능
C++에만 존재하는 연산자로 성공하면 해당 개체 포인터를, 실패시 0이나 예외를 던짐
malloc과 달리, 타입을 명확히 지정해 메모리를 할당하고, 자동으로 해당 타입의 포인터를 반환
객체 타입 메모리를 할당할 경우 생성자를 자동 호출하여 초기화 가능(매개변수에 맞게)
단, 배열을 할당할 때는 명시적 초기화 불가능. 객체의 경우 기본생성자만 호출됨
int* ptr = new int [] {1, 2, 3}; // 배열은 이런 초기화도 가능
메모리할당에 실패하면 당연히 초기화 안 일어남
그러므로 malloc과 같은 점은 메모리할당이지만, new는 추가적으로 초기화도 해주고, 반환자료형도 개체에 맞는 포인터를 반환해줌
메모리 크기 변경이 필요하면 새로 할당하고 복사, 해제해야 함
메모리 해제시에는 delete를 사용하며, 마찬가지로 메모리 풀로 복원함
new로 할당받은 메모리에만 delete를 사용해야하며, 0을 가리키는 포인터(null pointer)에는 delete사용 가능함.
이는 new가 할당실패시, 0을 반환하는데 이 경우에 delete 사용해도 괜찮음
delete사용 시 클래스의 경우 소멸자가 먼저 호출된 후 메모리 해제됨
사실 new는 내부적으로 객체 크기를 계산한 후 operator new(size_t size)를 호출하여 해당 크기만큼 메모리를 할당받음
malloc과 같이 초기화 없이 메모리만 할당해주는 함수이며 void*를 반환
다른점으로는, 메모리 할당 실패시 throw같이 C++의 예외규칙을 따름
클래스나 구조체같은 경우 자기만의 static operator new를 정의하여 사용할 수 있다
class MyClass {
public:
// 클래스 멤버로 operator new 정의 (메모리 할당 함수)
static void* operator new(size_t size) {
std::cout << "할당 크기: " << size << "\n";
// 실제 메모리는 전역 연산자 operator new 호출 (기본 할당)
void* p = ::operator new(size);
if (!p)
throw std::bad_alloc(); // 할당 실패 시 예외 처리
return p;
}
// 대응되는 operator delete도 정의 (메모리 해제)
static void operator delete(void* p) {
std::cout << "delete 호출\n";
::operator delete(p);
}
int x;
MyClass(int val) : x(val) {}
};
int main() {
MyClass* obj = new MyClass(42);
delete obj;
}
new 이용해 MyClass 생성시, 내부적으로 MyClass::operator new가 호출됨
해당 객체의 크기를 계산하여 operator new의 매개인자인 size로 들어가고, 전역 연산자인 operator new를 호출하여 기본 할당 진행
메모리 할당 되면 생성자도 호출되어 초기화도 이루어짐
delete로 메모리 해제시, 내부적으로 operator delete도 호출됨
operator new를 오버로딩함으로써, 메모리 할당을 제어할 수 있고, 디버깅과 메모리 관리 등에 활용할 수 있다Microsoft - new 및 delete 연산자
Microsoft - new operator (C++)
Microsoft - delete Operator (C++)

void ACXPlayerController::BeginPlay()
{
Super::BeginPlay();
if (IsLocalController() == false)
return;
}



