2013-10-03 2 views
4

malloc/free와 new/delete를 잘 비교하면 here이고, malloc() 및 free()가 here에서 어떻게 작동하는지 잘 설명합니다. 분명히, 우리는 그들을 섞어서는 안됩니다 - 새로운 것과 함께 자유롭게 사용하거나 malloc으로 삭제하십시오.malloc/free와 C++의 새로운/삭제 호환성?

위의 "no-mix"규칙을 존중하면서 많은 기여자가있는 많은 오픈 소스 프로젝트를 볼 수 있습니다. 일반적으로 하나의 파일 (한 명의 저자, ​​하나의 기본 설정)에 한 가지 방법 만 있습니다. 나는 그런 프로젝트를 갈래 았고 새로운/삭제 기능을 사용하여 몇 가지 기능을 추가하고있다. 그러나 나는 호기심 많은 기억 부패를 만난다.

  1. 내가 malloc에 ​​/ 무료 새로운 모두 메커니즘을 가질 수/삭제 : 물론,

    일부 "순진한"질문을 날 리드

    ..... 그들 중 아마 책임이 있지만, 동일한 편집 단위 (* .o)에서 - 물론 "no-mix"규칙을 존중합니까?

  2. 이 코드와 같이 두 가지 메커니즘을 인터리브 할 수 있습니까?

    int *a = (int *) malloc (1000 * sizeof int); 
    
    int *b = new int[1000]; 
    
    // some code 
    
    free a; 
    
    delete[] b; 
    
+1

네, 그렇지만 자신의 코드에서'new' 또는'malloc'을 사용해서는 안됩니다. 'unique_ptr' 나'shared_ptr'와 같은 스마트 포인터를 대신 사용하십시오. – Simple

+0

나는 그것이 합법적이라고 생각한다. –

+0

생성자 또는 소멸자가있는 유형에 대해'malloc()'및'free() '를 호출하지 않도록 보장합니까? 이러한 호출은 클래스의 생성자 및 소멸자를 실행하지 않으므로 문제의 원인이 될 수 있습니다. – Julien

답변

6

예 , 당신이 그들을 인터리브 할 수 있습니다 - 다만 할당에 사용 된 것과 일치하는 해제 기능을 사용합니다. 이 문제는 잘못된 할당 취소 기능을 사용하는 경우에만 발생합니다.

라이브러리가 여러 개있을 때 다른 힙을 사용할 수 있습니다. 올바른 이름의 함수를 사용하더라도 잘못된 모듈에서 구현 될 수 있으므로 잘못된 힙을 사용하게됩니다. 당신은 정의되지 않은 행동을합니다. 내가 여기서 말하는 것에 대해 더 잘 알고 싶다면 this answer을 참조하십시오.

+0

그리고 malloc은 생성자를 실행하지 않기 때문에 POD 데이터 유형에만 사용할 수 있다는 점에 유의하십시오. – Angew

+1

@Angew 당신은 여전히'malloc'을 사용할 수 있습니다. 단지'new'라는 배치를 사용하고 소멸자를 직접 호출해야합니다. 'T * p = :: new (std :: malloc (sizeof (T))) T (some, args); p-> ~ T(); std :: free (p);' – Simple

+0

@Simple 글쎄요. 그러나 그 때 질문은 이유입니다. – Angew