C++ | 팁
포스트
취소

C++ | 팁

C++ 팁

new, delete와 malloc, free의 차이?

C++에서 추가된 new, delete 키워드는 C의 malloc, free를 대체하는 키워드다.

new, delete는 클래스의 생성자, 소멸자를 호출한다.

delete, delete[]의 차이

int, double등 원시 타입의 경우 deletedelete[]의 차이가 없다.

배열로 동적 할당된 클래스의 경우 delete[]로 해제하지 않으면 메모리 누수가 발생한다.

delete시 자료형을 맞춰라

클래스의 경우 자료형을 맞추지 않으면 소멸자가 호출되지 않거나 잘못된 소멸자가 호출될 수 있다.

추가로 인터페이스(가상 클래스)에 소멸자를 선언해놓아야 하는 이유도 인터페이스 포인터로 delete시 override된 소멸자를 호출할 수 있기 때문이다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass {
public:
    MyClass() {
        cout << "MyClass Open" << endl;
    }
    ~MyClass() {
        cout << "MyClass Close" << endl;
    }
};

int main() {
    MyClass* p = new MyClass;
    delete p;
}

RESULT1

동적할당 후 해제하는 간단한 코드

delete를 사용하면 소멸자가 호출되고, 메모리 할당을 해제한다.

1
2
3
4
int main() {
    void* p = new MyClass;
    delete p;
}

RESULT1

여기서 MyClass*가 아니라 void* 등 다른 자료형으로 캐스팅 후 delete를 사용한다면 소멸자가 호출되지 않는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass2 {
public:
    MyClass2() {
        cout << "MyClass2 Open" << endl;
    }
    ~MyClass2() {
        cout << "MyClass2 Close" << endl;
    }
};

int main(int argc, char* argv[]) {
    MyClass2* p = (MyClass2*)(new MyClass);
    delete p;
    return 0;
}

RESULT3

심지어 MyClass2*로 캐스팅했을 때 MyClass2의 소멸자가 호출되기도 한다!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
바로가기