TIL_063 : new/malloc, 멀티 환경 설정

김펭귄·2025년 11월 17일

Today What I Learned (TIL)

목록 보기
63/139

오늘 학습 키워드

  • new vs malloc

  • 멀티 환경 설정

1. new vs malloc

  • 공통적으로 런타임에 힙에서 메모리를 할당해주는 함수

  • C에서는 malloc을 사용하였지만, C++에서는 new를 사용하게 되었음

malloc

void *malloc(
   size_t size
);
  • 원하는 크기의 메모리를(byte) 직접 입력하고, 해당 메모리만큼을 할당받아 void*로 반환. 리턴실패시 NULL 반환

  • 사실 메모리 할당 시, Alignment 및 메모리 유지관리 정보때문에 요청한 size보다 더 큰 메모리를 할당해줌

    • 메모리 블록의 경계 정렬을 맞추기 위해 Alignment를 유지함
  • 따라서 void*로 할당받으면, 사용할 포인터자료형으로 캐스팅하여 안전하게 사용

  • 할당 시 메모리만 제공해주고 초기화나 생성자 호출같은 작업은 없음

  • calloc은 0으로 초기화해주긴 함

  • 메모리 해제 시에는 free(ptr)을 사용하고 소멸자 이런거 없이 해제만 해줌

  • 메모리 해제하면, OS는 남은 영역을 병합하여 다시 할당 가능한 메모리 풀로 복원하고 이후에 다시 할당

  • 할당된 메모리의 크기를 realloc로 조정도 가능

new

  • C++에만 존재하는 연산자로 성공하면 해당 개체 포인터를, 실패시 0이나 예외를 던짐

  • malloc과 달리, 타입을 명확히 지정해 메모리를 할당하고, 자동으로 해당 타입의 포인터를 반환

  • 객체 타입 메모리를 할당할 경우 생성자를 자동 호출하여 초기화 가능(매개변수에 맞게)

  • 단, 배열을 할당할 때는 명시적 초기화 불가능. 객체의 경우 기본생성자만 호출됨

int* ptr = new int [] {1, 2, 3};	// 배열은 이런 초기화도 가능
  • 메모리할당에 실패하면 당연히 초기화 안 일어남

  • 그러므로 malloc과 같은 점은 메모리할당이지만, new는 추가적으로 초기화도 해주고, 반환자료형도 개체에 맞는 포인터를 반환해줌

  • 메모리 크기 변경이 필요하면 새로 할당하고 복사, 해제해야 함

  • 메모리 해제시에는 delete를 사용하며, 마찬가지로 메모리 풀로 복원함

  • new로 할당받은 메모리에만 delete를 사용해야하며, 0을 가리키는 포인터(null pointer)에는 delete사용 가능함.
    이는 new가 할당실패시, 0을 반환하는데 이 경우에 delete 사용해도 괜찮음

  • delete사용 시 클래스의 경우 소멸자가 먼저 호출된 후 메모리 해제됨

operator new

  • 사실 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++)

2. Dedicated 멀티 환경 설정

  • 간단히 테스트하기 위한 환경을 설정하기 위해, 플레이어수는 2명으로 설정하고, Dedicated Server이므로 Net Mode를 클라이언트로 설정

  • 위젯을 컨트롤러가 담당하여 화면에 띄었는데, 자기 컨트롤러가 자기 화면에만 띄워야 하므로 아래와 같이 코드를 추가해줌
void ACXPlayerController::BeginPlay()
{
	Super::BeginPlay();

	if (IsLocalController() == false)
		return;
}
  • 멀티플레이이므로, 프로세스가 하나로 돌아가면 안 됨. 에디터 설정에서 체크 해제

  • 에디터 설정에서 추후 참가도 허용. 그러면 플레이 도중에 클라이언트 추가가 가능


  • 에디터설정에서 "Launch Separate Server" 체크해주어, 서버와 클라이언트를 분리
profile
반갑습니다

0개의 댓글