C++ 팁
new, delete와 malloc, free의 차이?
C++에서 추가된 new
, delete
키워드는 C의 malloc
, free
를 대체하는 키워드다.
new
, delete
는 클래스의 생성자, 소멸자를 호출한다.
delete, delete[]의 차이
int
, double
등 원시 타입의 경우 delete
와 delete[]
의 차이가 없다.
배열로 동적 할당된 클래스의 경우 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;
}
동적할당 후 해제하는 간단한 코드
delete를 사용하면 소멸자가 호출되고, 메모리 할당을 해제한다.
1
2
3
4
int main() {
void* p = new MyClass;
delete p;
}
여기서 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;
}
심지어 MyClass2*
로 캐스팅했을 때 MyClass2의 소멸자가 호출되기도 한다!