new
/ delete
와 malloc
/ 의 차이점은 무엇입니까 free
?
관련 (중복?) : malloc과 new를 어떤 경우에 사용합니까?
new
/ delete
와 malloc
/ 의 차이점은 무엇입니까 free
?
관련 (중복?) : malloc과 new를 어떤 경우에 사용합니까?
답변:
기능의 테이블 비교 :
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
기술적으로 new에 의해 할당 된 메모리는 'Free Store'에서, malloc에 의해 할당 된 메모리는 'Heap'에서옵니다. 이 두 영역이 동일한 지 여부는 구현 세부 사항이므로 malloc과 new를 혼합 할 수없는 또 다른 이유입니다.
If ptr is NULL, no operation is performed.
new
운영자는 무료 저장소 ( 동적 메모리 라고도 함) 에서 메모리를 할당 합니다 와 힙 하십시오.) C ++는 14 표준, 섹션 3.7.4 동적 스토리지 "객체는 새로운 식 (5.3.4)을 사용하여, 프로그램 실행 (1.9) 중에 동적으로 생성 할 수 있으며, 삭제 표현식을 사용하여 파괴했다."라고
가장 중요한 차이점은 new
연산자가 메모리를 할당 한 다음 생성자를 delete
호출하고 소멸자를 호출 한 다음 메모리 할당을 해제한다는 점입니다.
new
객체의 ctor를 delete
호출하고 dtor를 호출합니다.
malloc
및 free
단지 할당하고 원시 메모리를 해제.
new
/ delete
는 C ++이고 malloc
/ free
는 오래된 C에서 나옵니다.
C ++에서는 new
객체 생성자를 delete
호출하고 소멸자를 호출합니다.
malloc
와 free
, OO 전에 어둠의 시대에서 오는에만 할당하고 개체의 코드를 실행하지 않고, 메모리를 해제.
유일한 차이점은 malloc
/ new
둘 다 힙의 일부 메모리를 처리하는 포인터를 반환 한다는 것입니다. 두 메모리 모두 일단 그러한 메모리 블록이 반환되면 먼저 해제 / 삭제하지 않으면 다시 반환되지 않습니다. 즉, 둘 다 메모리를 "할당"합니다.
그러나 new
/ delete
생성자 소멸자 연산자 오버로딩 통해 이외에 임의의 다른 작업을 수행한다. malloc
/ free
항상 메모리를 할당하고 해제하십시오.
실제로, new
힙에서 메모리를 반환하거나 메모리를 전혀 할당하지 않아도되도록 충분히 사용자 정의 할 수 있습니다. 그러나 기본값 new
은 그렇지 않습니다.
new와 malloc의 주요 차이점은 new가 객체의 생성자를 호출하고 delete에 대한 해당 호출이 객체의 소멸자를 호출한다는 것입니다.
다른 차이점이 있습니다.
new
타입 안전하고 malloc
타입의 객체를 반환void*
new
오류에 대한 예외를 발생 시키고 errno를 malloc
반환 NULL
하고 설정합니다
new
연산자이고 오버로드 될 수 있고, malloc
함수이며 오버로드 될 수 없습니다
new[]
배열을 할당하는,보다 직관적이고 형식이 안전합니다. malloc
malloc
를 통해 파생 할당의 크기를 조정할 수 있으며 realloc
, new
파생 할당의 크기를 조정할 수 없습니다
malloc
메모리의 N 바이트 청크 new
를 할당 할 수 있으며 char
유형 의 배열을 할당하도록 요청해야합니다
차이점을 살펴보면, malloc은 C-esque이고 new는 C ++-esque입니다. 코드 기반에 맞는 것을 사용하십시오.
서로 다른 메모리 할당 알고리즘을 사용하여 새 시스템과 malloc을 구현하는 것이 합법적이지만 대부분의 시스템에서 새 시스템은 malloc을 사용하여 내부적으로 구현되므로 시스템 수준의 차이는 없습니다.
몇 가지가 있습니다 new
것을 수행 malloc
하지 않습니다는 :
new
해당 객체의 생성자를 호출하여 객체를 생성합니다.new
할당 된 메모리의 타입 캐스팅이 필요하지 않습니다.따라서를 사용하는 경우 malloc
위의 작업을 명시 적으로 수행해야합니다. 이는 항상 실용적이지는 않습니다. 또한 new
오버로드 될 수는 있지만로드 malloc
할 수 없습니다.
한마디로 C ++를 사용한다면 new
가능한 많이 사용 하십시오.
new
그리고 클래스의 새 인스턴스를 선언하거나 삭제하는 delete
C ++ 프리미티브 입니다 (따라서 인스턴스의 클래스 소멸자를 호출).
malloc
와 free
C에있는 기능 그리고 그들은 할당하고 사용 가능한 메모리 블록 (크기).
둘 다 힙을 사용하여 할당합니다. malloc
그리고 free
그들은 단지 아마도 포인터와 연결됩니다 메모리 공간의 덩어리를 보유으로 그럼에도 불구하고 더 "낮은 수준"입니다. C 배열을 구조로 간주하지 않는 한 해당 메모리 주위에 구조가 작성되지 않습니다.
new와 delete는 c ++의 연산자입니다. 오버로드 될 수 있습니다. malloc 및 free는 c에서 기능합니다.
malloc은 새 예외가 발생하는 동안 실패하면 null ptr을 리턴합니다.
malloc에 의해 리턴 된 주소는 (void *) malloc (size)를 리턴하므로 다시 캐스트 된 유형에 의해 필요합니다.
키워드 삭제 또는 무료 기능을 사용하기위한이 코드입니다. 그러나 'malloc'또는 'new'를 사용하여 포인터 객체를 만들고 delete를 사용하여 객체 메모리를 할당 해제하면 해당 객체 포인터가 클래스에서 호출 함수 일 수 있습니다. 삭제 대신 free를 사용하면 free 문 후에도 작동하지만 둘 다 사용하면 포인터 객체 만 클래스에서 함수를 호출 할 수 없습니다. 코드는 다음과 같습니다.
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
출력 :
Hello Hi 0x2abfef37cc20