malloc() & free() 와 new() & delete() 특징
C++에서 malloc() 및 free() 함수는 힙에서 동적으로 메모리를 할당 및 할당 해제하는 데 사용됩니다. malloc()은 지정된 크기의 힙에 메모리 블록을 할당하는 데 사용되는 C 표준 라이브러리의 함수입니다. 이 함수는 할당된 메모리의 첫 번째 바이트에 대한 포인터를 반환하거나 할당에 실패한 경우 null 포인터를 반환합니다.
free()는 이전에 malloc()으로 할당된 메모리 블록을 할당 해제하는 데 사용되는 C 표준 라이브러리의 함수이기도 합니다. 이 함수는 메모리 블록에 대한 포인터를 인수로 사용하고 다시 사용할 수 있도록 시스템에 다시 해제합니다.
반면에 C++는 힙에 메모리를 할당하고 할당 해제하는 new 및 delete 연산자도 제공합니다. new는 힙에 객체의 인스턴스를 생성하고 생성자로 생성하는 데 사용됩니다. 연산자는 새로 생성된 개체에 대한 포인터를 반환합니다.
delete는 이전에 new로 할당된 메모리를 할당 해제하고 삭제 중인 개체의 소멸자를 호출하는 데 사용됩니다. 연산자는 개체에 대한 포인터를 인수로 사용합니다.
malloc() 및 free()는 저수준 C 함수이며 개체의 생성자와 소멸자를 호출하지 않는다는 점은 주목할 가치가 있습니다. 반면에 new 및 delete는 C++ 전용이며 개체의 생성자와 소멸자를 호출합니다.
또한 new 및 delete에는 예외 처리, 오버로드 및 new 배치와 같은 몇 가지 추가 기능이 있다는 점도 주목할 가치가 있습니다.
다음은 C++에서 정수에 대해 동적으로 메모리를 할당하기 위해 malloc() 및 free()를 사용하는 예입니다.
#include <cstdlib> // for malloc and free
int main() {
int *ptr = (int *)malloc(sizeof(int)); // allocate memory for an int
*ptr = 5; // store the value 5 in the allocated memory
std::cout << "ptr = " << ptr << std::endl; // prints the memory address of the allocated memory
std::cout << "*ptr = " << *ptr << std::endl; // prints "5"
free(ptr); // deallocate the memory
return 0;
}
다음은 C++에서 객체에 대해 동적으로 메모리를 할당하기 위해 new 및 delete를 사용하는 예입니다.
class MyClass {
public:
MyClass(int x) {
this->x = x;
}
int x;
};
int main() {
MyClass *ptr = new MyClass(5); // dynamically create an instance of MyClass on the heap and call its constructor
std::cout << "ptr = " << ptr << std::endl; // prints the memory address of the object
std::cout << "ptr->x = " << ptr->x << std::endl; // prints "5"
delete ptr; // deallocate the memory and call the destructor of the object
return 0;
}
new 및 delete를 사용하는 것이 일반적으로 malloc() 및 free()를 사용하는 것보다 더 편리하고 안전하다는 점은 주목할 가치가 있습니다. new 및 delete는 생성자, 소멸자 및 예외 처리를 처리하지만 malloc() 및 free()는 그렇지 않기 때문입니다.
malloc & free 대신 new & delete를 사용하는 이유와 어느 것이 더 좋을까?
new 및 delete는 일반적으로 여러 가지 이유로 C++에서 malloc() 및 free()보다 선호됩니다.
new 및 delete는 생성자와 소멸자를 자동으로 처리하지만 malloc() 및 free()는 그렇지 않습니다. 즉, new를 사용하여 객체를 만들면 해당 생성자가 자동으로 호출되고 delete를 사용하여 객체를 삭제하면 해당 소멸자가 자동으로 호출됩니다. 이는 리소스를 할당하거나 생성자 또는 소멸자에서 다른 설정 또는 정리 작업을 수행해야 하는 객체에 특히 유용합니다. new 및 delete는 예외 처리를 자동으로 처리하지만 malloc() 및 free()는 그렇지 않습니다. 즉, new로 생성된 객체의 생성자 실행 중 예외가 발생하면 객체에 할당된 메모리가 자동으로 해제되어 메모리 누수를 방지합니다. new 및 delete에는 malloc() 및 free()에서 사용할 수 없는 오버로드 및 배치 new와 같은 몇 가지 추가 기능이 있습니다. 어느 것이 더 나은지는 특정 사용 사례와 프로젝트 요구 사항에 따라 다릅니다. 일반적으로 C++로 작업할 때는 new 및 delete를 사용하여 제공하는 기능을 활용하는 것이 좋지만 C 코드로 작업하거나 C 라이브러리와 상호 운용해야 하는 경우에는 malloc() 및 free(를 사용해야 할 수도 있습니다. ).
또한 Java와 같이 자동 메모리 관리를 사용하는 C# 및 기타 언어는 수동 메모리 관리의 필요성을 완전히 제거하여 코드를 더 단순하게 만들고 오류 발생 가능성을 줄일 수 있다는 점도 주목할 가치가 있습니다.
어느 것이 처리 속도가 더 빠를까?
일반적으로 new 및 delete는 생성자 및 소멸자 호출 및 예외 처리 처리와 같은 추가 기능으로 인해 malloc() 및 free()보다 오버헤드가 약간 더 높습니다. 이는 특정 시나리오에서 malloc() 및 free()를 사용하여 메모리를 할당 및 할당 해제하는 것이 new 및 delete를 사용하는 것보다 약간 더 빠를 수 있음을 의미합니다.
그러나 new와 delete, malloc()과 free() 간의 성능 차이는 일반적으로 작으며 대부분의 경우 눈에 띄지 않을 수 있습니다. 또한 성능 차이는 C++ 표준 라이브러리의 특정 구현과 시스템에서 사용하는 메모리 할당자에 따라 달라질 수 있으므로 일반적인 설명을 제공하기는 어렵습니다.
실제로는 성능에만 초점을 맞추는 것보다 프로젝트의 요구 사항과 코드의 요구 사항에 따라 적절한 메모리 관리 방법을 선택하는 것이 더 중요합니다. new 및 delete는 약간 더 높은 오버헤드가 있더라도 코드를 더 안전하고 쉽게 유지 관리할 수 있는 추가 기능을 제공합니다.
또한 할당 및 할당 해제되는 개체의 수와 크기, 할당 및 할당 해제 빈도, 시스템 메모리 할당자의 성능과 같은 다른 요소가 애플리케이션의 전체 성능에 훨씬 더 큰 영향을 미칠 수 있다는 점도 주목할 가치가 있습니다.
'C++ > 입문편' 카테고리의 다른 글
[입문편] 10강. Class 기본 구조&예시 및 Struct 구문과의 차이점을 알아보자 (0) | 2023.01.22 |
---|---|
9강. C++과 C#의 차이점 → 메모리 누수 및 속도 측면에서 살펴보자 (0) | 2023.01.22 |
8강. 실행중인 프로그램의 메모리 공간을 살펴보자 (데이터, 스택, 힙, malloc & free) (0) | 2023.01.22 |
7강. 포인터와 레퍼런스 기본 개념 및 예시 코드로 살펴보기(With Call-by-value, Call-by-reference) (0) | 2023.01.22 |
6강. 단일 및 이중 배열 기본 구조 및 예시 살펴보기 (0) | 2023.01.22 |
댓글