LANG/C++

[C++]08-3.가상 소멸자와 참조자의 참조 가능성

혀니리리 2023. 5. 16. 12:38
728x90

가상함수 말고도 virtual키워드를 붙여줘야 할 대상 = 소멸자

가상소멸자

#include <iostream>
using namespace std;

class First
{
private:
    char *strOne;
public:
    First(char *str)
    {
        strOne = new char[strlen(str) + 1];
    }
    ~First()
    {
        cout <<"~First()" <<endl;
        delete []strOne;
    }
};

class Second:public First
{
private:
    char *strTwo;
public:
    Second(char *str1, char *str2) : First(str1)
    {
        strTwo = new char[strlen(str2) + 1];
    }
    ~Second()
    {
        cout <<"~Second()" <<endl;
        delete []strTwo;
    }
};

int main(void)
{
    First *ptr = new Second("simple", "complex");
    delete ptr;
    return 0;
}

이같은 경우 객체의 소멸을 First형 포인터로 명령 -> First클래스의 소멸자만 호출됨 ->메모리 누수 발생.

따라서

virtual ~First()

{

 cout <<"~First()" <<endl;

delete []strOne;

}

이렇게 앞에 virtual을 붙여야 함.

 

728x90