C++ 클래스 new delete 가 이해가 ^^;;
글쓴이: la9527 / 작성시간: 화, 2003/09/23 - 12:10오후
예를 들어..
class A { public: void A(void); } void A::A(void) { char* A[] = new char [100]; } main() { A* a = new A; delete a; }
이렇게 되었을때 A 클래스 안의 new 데이터는 delete 시켜주지 않아도 되는지 궁금합니다. 과연 메모리가 새는지.. ^^;
이렇게 하면 않된다는걸 아는데.. 과연 괜찮은지 설명 좀 부탁 드립니다. ^^;;
Forums:
^^
이 코드는 아예 잘못된 코드인것 같은데요. 일단 클래스 내에 'void A(void); ' 이렇게 주신건 생성자를 의도하신건지 아닌지 모르겠네요. 생성자는 리턴 타입이 존재하지 않아 ' A(void) ' 이렇게 주셔야 되거든요. 그리고 A() 함수 내에 " char* A[] = new char [100]; " 이 부분도 틀린 문법이네요. []<- 이놈을 제거해 주셔야죠. 즉... char* A = new char [100]; 이렇게 해 주시구요.
아울러 님께서 궁금해 하시는 메모리 누수는 존재합니다. 님의 코드는 만약 문법적으로 하자가 없다 해도 void A() 라는 함수 안에서 new를 해 주셨기 때문에.. void A()함수 끝에 delete를 해 주셔야 합니다. 아래와 같은 식으로요.
void A::A(void)
{
char* A = new char [100];
/*
여기서 어떤 일들을 하겠죠??
*/
delete A; // 반드시 넣어 줘야죠.
}
delete 는 소멸자에서..
member 가 동적할당하면 보통 소멸자에서 delete 하죠.
어느정도 공부가 진행되었는지 모르겠습니다만 이런 것은 대입연산자와 복사생성자에도 신경을 써서 만들어야 합니다.
참조
흠
A::A{}
속에 있는 char *A = new char[100];
이놈은 삭제되지 않습니다.
동적할당된 메모리는 삭제시만 삭제가 가능합니다.
만약 클래스만 삭제 했을때 그 안에 사용된 모든 메모리 객체를 해제 하고 싶으시면 동적객체 할당을 멤버 변수로 잡아 주시고 소멸자에 delete를 넣어주시면 됩니다.
이렇게
참조가 되셨는지요
그럼
감사합니다.
좋은 참고 자료가 되었습니다.
답변 감사드립니다. ^^
제가 코드를 정확하게 않써서 ^^;; 잘못된 경우가 많이 눈에 보이네여..
제가 생각하고자 한것은 꼭 new를 해주면 delete는 따라가야 되는것 이게 맞는 말인지요?
제 생각은 클래스를 new 생성하고 나서 delete 시켜주면 클래스 내용안의 함수에 new되어 있는 것도 같이 delete 되어주지 않을까 하는 생각에 의해서 입니다.
다시한번 답변 감사드립니다. ^^
https://github.com/la9527
네 따라가야 합니다.
전체와 내부는 독립적으로 동적할당되고 해제됩니다.
이것은 class 가 아닌 struct 도 마찬가지입니다.
동적할당한 member 를 해제하기 전에 전체 객체를 해제하면 member 를 다시 접근할 수 없기 때문에 전체객체를 해제하기 전에 member 부터 해제해야 하며, 따라서 소멸자가 존재하는 것입니다.
댓글 달기