1번.

new 연산자는 생성과 동시생성자를 호출한다. (생성자: 객체의 초기화를 담당)


그래서 malloc()을 이용한 동적할당은 따로 초기화 과정을 추가해야하지만, new는 그런 과정이 없다.

malloc()을 이용하여 동적할당을 할 경우 초기화는 memset() 함수를 쓰면 편하다.

만약 calloc()을 사용하면 할당과 동시에 메모리 초기화가 가능하다. 


2번.

malloc()함수이고, new 키워드는 연산자이다.


그러므로 malloc()은 별도의 헤더파일 추가가 필요하지만 new는 필요하지 않다.



*그럼 언제 malloc()이 유용할까?

객체와 관련된 작업이 아닐 경우, 그리고 할당과 해제가 반복되는 작업을 할 경우이다.

malloc()은 realloc()이라는 짝꿍이 존재한다.

new 연산자로 기존의 데이터를 유지하면서 새로운 할당이 필요할 경우, '할당 -> 복사 -> 해제'의 과정을 밟는다.

하지만 realloc()을 사용할 경우 기존의 메모리를 확장하거나 아니면 새로이 확장된 메모리를 할당한다.

그렇기에 따로 복사의 과정을 코드에 넣지 않아도 된다.



*주의점

객체의 생성은 무조건 new 연산자로 한다.

동적할당을 했으면 반드시 해제를 해준다. (Garbage Collector가 없는 언어의 경우)


realloc() 사용 시, 반드시 기존 메모리 주소에 대해 복사해두어야 한다.

왜냐하면 realloc() 실패 시, NULL주소를 반환하기에 기존 메모리 주소를 잃어버릴 경우가 있다.




*추가로 조사할 점.

메모리 할당을 위한 System Call 요청은 실행 스택에 메모리를 생성하는 것 만큼 빠르지 않다.

(잦은 할당/해제는 많은 오버헤드가 발생, 동적할당은 메모리 실행 스택이 아닌 Heap구조에 저장된다.)

또한,

malloc()이나 new는 할당 요청 Byte이외에도 얼마나 메모리를 요청했는지 기록을 위한 mstat구조체(4~32Byte)를 추가할당.



*그리고 Garbage Collector가 없는 이상 메모리의 획득과 해제는 항상 같은 흐름에서 끝나야한다.

(이를 방지하는 것이 바로 스마트포인터)


*malloc()이나 new의 잦은 할당과 해제는 다양한 메모리 블록 사이즈로 인한 메모리 단편화를 유발하였다.(이전 OS)



*마지막으로 메모리 풀의 등장배경과 이점은?



+ Recent posts