>source

부름 delete 클래스의 소멸자를 호출하지만 free() 하지 않습니다.

메모리 누수가 발생할 수 있습니까? 그렇지 않다면 왜?

#include <iostream>
#include <cstdlib>
using namespace std;
class x{
 public:
 int a;
 ~x(){cout<<"destroying"<<endl;}
};
int main() {
  x *y = (x*)malloc(sizeof(x));
  free(y);
  x *z = new x;
  delete z;
  return 0; 
}

  • 답변 # 1

    Can that cause a memory leak?

    귀하의 특정 예에서는 아닙니다. 그만큼 x 객체는 단지 존재할당으로 malloc() . free() 올바르게할당 해제그 기억 malloc() 할당. 그러나 개체는파괴이 예에서는 괜찮습니다.구성된처음에는 파괴 할 것이 없습니다. 그러나 생성자가 실행될 것으로 예상하는 방식으로 해당 객체를 사용하려고하면정의되지 않은 동작영토.

    C (여기서 malloc()free() 에서 온) 클래스에 대한 개념이 없습니다.메모리 (비) 할당. 반면에 C ++에는메모리 (비) 할당객체 (해체)따라서 올바르게 사용하고 잘못 혼합하지 않도록 매우주의해야합니다.

    개체가구성된통하다 new , 하지만할당 해제으로 free() 존재보다는파괴으로 delete , 코드는 확실히정의되지 않은 동작, 그 객체가 객체의 소멸자가 해제 할 것으로 예상되는 추가 메모리를 내부적으로 할당 한 경우 해당 추가 메모리가 누수됩니다.

  • 답변 # 2

    Can free() cause a memory leak?

    그렇지 않습니다. 그러나 정의되지 않은 동작이 발생할 수 있습니다. 물론 프로그램의 동작이 정의되지 않은 경우 메모리 누수가 가능한 동작 중 하나입니다. 다른 모든 행동과 마찬가지로.

  • 이전 sqlite - 파이썬에서 커밋 한 후에도 sqlite3에 데이터가 삽입되지 않음
  • 다음 string - C #에서 두 개의 쉼표로 구분 된 목록을 비교하여 차이점 확인