신규 / 삭제와 malloc / free의 차이점은 무엇입니까?


답변:


466

신규 / 삭제

  • 메모리 할당 / 해제
    1. 'Free Store'에서 할당 된 메모리
    2. 완전 형식의 포인터를 반환합니다.
    3. new (표준 버전)는 NULL을 반환하지 않습니다 (실패시 발생)
    4. Type-ID로 호출됩니다 (컴파일러가 크기를 계산 함)
    5. 명시 적으로 배열을 처리하는 버전이 있습니다.
    6. (공간을 확보하기 위해) 재 할당 (복사 생성자 때문에) 직관적으로 처리되지 않습니다.
    7. 그들이 malloc / free를 호출하는지 여부는 구현 정의됩니다.
    8. 메모리 부족을 처리하기 위해 새 메모리 할당자를 추가 할 수 있습니다 (set_new_handler)
    9. 운영자 신규 / 삭제는 법적으로 재정의 될 수 있습니다.
    10. 객체를 초기화 / 파기하는 데 사용되는 생성자 / 소멸자

malloc / free

  • 메모리 할당 / 해제
    1. '힙'에서 할당 된 메모리
    2. 보이드를 돌려줍니다 *
    3. 실패시 NULL을 반환
    4. 필요한 크기를 바이트 단위로 지정해야합니다.
    5. 배열을 할당하려면 공간을 수동으로 계산해야합니다.
    6. 더 큰 메모리 청크 재 할당 단순 (걱정할 복사 생성자 없음)
    7. 그들은 새로운 / 삭제를 호출 하지 않습니다
    8. 메모리 부족을 위해 사용자 코드를 할당 시퀀스에 결합 할 수 없습니다.
    9. malloc / free는 법적으로 재정의 될 수 없습니다

기능의 테이블 비교 :

 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를 혼합 할 수없는 또 다른 이유입니다.


12
누군가가 힙과 달리 "무료 저장소"에 대해 자세히 편집 할 수 있습니까? 프로세스의 힙은 잘 알려진 언어 독립적 (?) 운영 체제 수준 개념입니다. "무료 매장"은 어디에서 왔습니까?
einpoklum

1
@einpoklum : 메모리 영역의 이름 일뿐입니다. "힙"이라고하는 언어 개념이나 "프로세스 힙"의 OS 개념과는 아무 관련이 없습니다. C ++은 일부러 플랫폼 / OS / 컴파일러 중립으로 정의되었습니다. 따라서 "프로세스 힙"과 같은 특정 OS 개념을 사용하면 표준의 유연성이 떨어집니다.
Martin York

4
@winterlight : 사실 이었지만 더 이상은 아닙니다. 참조 : linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari '힙', '무료 저장'및 '동적 메모리 / 스토리지'는 동의어처럼 보입니다. Bjarne Stroustrup의 A + C 투어에서 " new운영자는 무료 저장소 ( 동적 메모리 라고도 함) 에서 메모리를 할당 합니다 하십시오.) C ++는 14 표준, 섹션 3.7.4 동적 스토리지 "객체는 새로운 식 (5.3.4)을 사용하여, 프로그램 실행 (1.9) 중에 동적으로 생성 할 수 있으며, 삭제 표현식을 사용하여 파괴했다."라고
맥스 Heiber

2
@ mheiber : 그것은 동일 할 수 있음을 의미합니다. 그리고 몇 가지 구현은 malloc을 호출하여 새로운 것을 구현합니다 (다른 방법은 명시 적으로 허용되지 않습니다). 그러나 여러 구현은 이러한 메모리 영역을 완전히 분리시킵니다. 너무 분리 된 이유는 C ++ 메모리 관리 코드를 C 메모리 관리와 다른 방식으로 최적화 할 수 있기 때문입니다. 요점은 다음과 같습니다. 그것들은 같을 수 있지만 당신은 그들이 있다고 가정 할 수 없습니다.
Martin York

81

가장 중요한 차이점은 new연산자가 메모리를 할당 한 다음 생성자를 delete호출하고 소멸자를 호출 한 다음 메모리 할당을 해제한다는 점입니다.


22
엄밀히 말하면, 새로운 연산자는 메모리를 할당합니다. new 연산자를 호출 한 다음 할당 된 메모리에서 생성자를 실행하는 것은 새로운 표현식입니다.
Don Wakefield

또 다른 차이점은 메모리가 할당되는 위치입니다. 나는 최근 malloc / free가 힙에서 작동하는 곳을 보았지만 new / delete는 이름이 다른 메모리 영역에서 작동합니다. (그러나 다른 지역은 아마도 다른 더미로 생각할 수 있다고 말하면 충분합니다.)
RobH

2
@mgb : 예. "응용 프로그램 힙"또는 스택에 객체가 할당되어 있는지 확인하십시오. 그러나 @RobH는 표준이 "응용 프로그램 힙"의 다른 부분을 부르는 것을 말합니다. malloc이 메모리를 할당하는 "힙"과 new가 메모리를 할당하는 "Free Store"가 있습니다. 에서 비록 일부 구현은 이러한 영역 오버랩 할 (이것은 구현의 세부 사항이다).
Martin York

1
귀하의 진술은 100 % 정확하지만 요청 된 질문에 답변하지 않습니다. 아래 답변을 참조하십시오. 귀하의 의견보다 더 많은 투표를하는 이유가 있습니다.
Murali

1
내가 말하려는 것은 적어도 malloc / free에 대한 언급이 있어야 귀하의 답변이 부족한 비교 대상이 될 수 있습니다. 그럼에도 불구하고, 그것은 관련성이 있고 정확한 진술이므로, 공감대, 나는 당신이 내 요점을 이해하기를 바랍니다. 어쨌든 SO만으로 다운 보트를 되 찾을 수 있다면 진심으로 그렇게 할 것입니다.
Murali

30

new객체의 ctor를 delete호출하고 dtor를 호출합니다.

mallocfree단지 할당하고 원시 메모리를 해제.


원시 메모리는 무엇을 의미합니까?
소멸자

3
원시 메모리는 아무 것도 수행되지 않았습니다. 객체가 아직 생성되지 않았으며 아무것도 복사되지 않았으며 대부분의 경우 이전 내용이 덮어 쓰여지지 않았습니다.
James Curran

14

new/ delete는 C ++이고 malloc/ free는 오래된 C에서 나옵니다.

C ++에서는 new객체 생성자를 delete호출하고 소멸자를 호출합니다.

mallocfree, OO 전에 어둠의 시대에서 오는에만 할당하고 개체의 코드를 실행하지 않고, 메모리를 해제.


9
"OO 이전의 암흑 시대에서 온 것" 은 실제로 는 새롭거나 삭제 된 것이 malloc / free보다 낫다 는 것을 암시하는 것처럼 들립니다 . 내가 당신을 억압했던 온전한 사람이 아니라는 것만 기억하세요.
Graeme Perrow

13

C ++에서 new/는 delete이에 따라 생성자 / 소멸자를 호출합니다.

malloc/ free단순히 힙에서 메모리를 할당하십시오. new/ delete메모리도 할당하십시오.


10

유일한 차이점은 malloc/ new둘 다 힙의 일부 메모리를 처리하는 포인터를 반환 한다는 것입니다. 두 메모리 모두 일단 그러한 메모리 블록이 반환되면 먼저 해제 / 삭제하지 않으면 다시 반환되지 않습니다. 즉, 둘 다 메모리를 "할당"합니다.

그러나 new/ delete생성자 소멸자 연산자 오버로딩 통해 이외에 임의의 다른 작업을 수행한다. malloc/ free항상 메모리를 할당하고 해제하십시오.

실제로, new힙에서 메모리를 반환하거나 메모리를 전혀 할당하지 않아도되도록 충분히 사용자 정의 할 수 있습니다. 그러나 기본값 new은 그렇지 않습니다.


7

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을 사용하여 내부적으로 구현되므로 시스템 수준의 차이는 없습니다.


5

몇 가지가 있습니다 new것을 수행 malloc하지 않습니다는 :

  1. new 해당 객체의 생성자를 호출하여 객체를 생성합니다.
  2. new 할당 된 메모리의 타입 캐스팅이 필요하지 않습니다.
  3. 할당 할 메모리 양이 필요하지 않고 여러 개체를 구성해야합니다.

따라서를 사용하는 경우 malloc위의 작업을 명시 적으로 수행해야합니다. 이는 항상 실용적이지는 않습니다. 또한 new오버로드 될 수는 있지만로드 malloc할 수 없습니다.

한마디로 C ++를 사용한다면 new가능한 많이 사용 하십시오.


4

또한,

글로벌 신규 및 삭제는 무시할 수 있으며 malloc / free는 불가능합니다.

유형별로 더 많은 새로운 및 삭제를 무시할 수 있습니다.


3

new그리고 클래스의 새 인스턴스를 선언하거나 삭제하는 deleteC ++ 프리미티브 입니다 (따라서 인스턴스의 클래스 소멸자를 호출).

mallocfreeC에있는 기능 그리고 그들은 할당하고 사용 가능한 메모리 블록 (크기).

둘 다 힙을 사용하여 할당합니다. malloc그리고 free그들은 단지 아마도 포인터와 연결됩니다 메모리 공간의 덩어리를 보유으로 그럼에도 불구하고 더 "낮은 수준"입니다. C 배열을 구조로 간주하지 않는 한 해당 메모리 주위에 구조가 작성되지 않습니다.


1
C ++의 새로운 기능은 클래스의 인스턴스를 선언하지 않습니다. (보통) 힙에서 하나를 할당하고 아무것도 선언하지 않습니다. 선언의 저장 기간에 따라 인스턴스를 선언하여 스택에 선언하거나 전역으로 선언함으로써 인스턴스를 선언 할 수 있습니다.
Steve Jessop

글쎄, 클래스에 대한 메모리 공간을 할당하지만 실제로 클래스를 스택에 저장한다는 의미가 아니라 스택에서 클래스를 "선언"할 수 없습니다. 선언에는 클래스에 대한 포인터 만 포함되며, 클래스에 대한 실제 메모리가 힙에 스택에 항상 할당됩니다.
Jorge Córdoba

그래 넌 할수있어. 질문 태그에 따르면 이것은 C ++이므로 객체가 스택에 갈 수 있습니다. 그리고 new는 선언이 아니라 표현입니다. 무언가를 선언하고 할당하는 것은 별개의 것입니다.
Steve Jessop

2

new와 delete는 c ++의 연산자입니다. 오버로드 될 수 있습니다. malloc 및 free는 c에서 기능합니다.

malloc은 새 예외가 발생하는 동안 실패하면 null ptr을 리턴합니다.

malloc에 ​​의해 리턴 된 주소는 (void *) malloc (size)를 리턴하므로 다시 캐스트 된 유형에 의해 필요합니다.


2
  • malloc ()은 함수이지만 new는 연산자입니다.
  • new는 정확한 데이터 유형을 반환하는 반면, malloc ()은 void * (void 유형의 포인터)를 반환합니다.
  • malloc (), 메모리가 초기화되지 않고 기본값은 가비지 인 반면, new의 경우 메모리는 int의 경우 '0 (0)'과 같이 기본값으로 초기화됩니다.
  • delete 및 free ()는 모두 'NULL'포인터에 사용할 수 있습니다.

0
  • 를 사용하려면 malloc()필요 하지 않은 프로그램 을 포함 <stdlib.h> 시키거나 <alloc.h>프로그램에 포함시켜야합니다 new.
  • new그리고 delete오버로드 할 수 있지만 malloc수 없습니다.
  • 배치를 사용하면 new메모리를 할당하려는 주소를 전달할 수 있지만이 경우에는 불가능합니다 malloc.

1
alloc.h표준 헤더가 아닙니다. <new>게재 위치를 새로 사용해야합니다.
MM

0

키워드 삭제 또는 무료 기능을 사용하기위한이 코드입니다. 그러나 '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

-3

1. 새로운 신텍스는 malloc ()보다 간단합니다

2.new/delete는 malloc () / free ()가 함수 인 연산자입니다.

3.new/delete는 malloc () / free ()보다 빠르게 실행됩니다. 컴파일러에 의해 새로운 어셈블리 코드가 직접 붙여지기 때문입니다.

4. 우리는 연산자 겹쳐서의 도움으로 프로그램에서 새로운 / 삭제 의미를 변경할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.