이유에 앞서, C++ operator new 와 operator delete의 관례란? 1. 올바른 인자값을 가져야 한다. 2. 메모리가 충분하지 않을때 에러처리 함수를 호출해야 한다. 즉, 사용 가능한 메모리가 없을 때 요구에 대처해야 한다. 이유 1. 부모 클래스에 선언한 operator new(new[])를 상속 받은 자식 클래스는 부모클래스의 new를 호출한다. (이때 오버라이딩은 되지 않는다. 문법 기초다. 그래서 오버로딩을 해서 쓰는데, 역시 오버로딩의 한계가있다) 하지만 대개 자식 클래스는 부모클래스보다 메모리를 더 많이 차지하므로, 자식클래스의 메모리 할당시 부모클래스의 용량(메모리)로 잡을수도 없는 노릇이다. 부모클래스의 용량을 포함하는 자식클래스의 용량의 할당이 올바른 반환값이다. 한마..
Effective C++ 검색 결과
이유 1. 동적 메모리 할당시, 메모리가 되었을 때, 여러 이유로 오류가 날수 있다. 이 오류에 대해서 대처하지 않으면 프로그램이 안정적이지 못하기 때문이다. (참고)new연산자는 메모리 요구를 수행하지 못하면, 수행될때까지 루프를 돈다. 해결 방법 operator new가 요구된 메모리를 할당할 수 없을 때 new 핸들러 함수는 다음중 한가지를 실행시킨다. 1. 좀더 많은 메모리르 확보한다. 방법 : 프로그램 시작시 큰 메모리를 할당받게 한다. 그리고 new 핸들러가 호출되었을때, 이 미리 받은 메모리를 해체한다. 단점 : 가끔 메모리가 적거나 좀더 많은 메모리가 확보되지 않으면, 다음에 발생되는 new가 원할히 작동될수 없다. 2. 다른 new 핸들러를 설치한다. 방법 : set_new_handler..
이유 1. 메모리 릭이 발생되기 때문이다. 2. 동적메모리 할당 중 에러 발생시, 예상치 못한 결과가 나올수 있다. (참고) 널포인터 삭제는 언제나 안전하기 때문이다. 해결방법 1. 할당에 실패할시 0값을 넣어라. (C++0x 가 적용되면 nuulptr 이 쓰일것으로 생각된다) 2. 소멸자에서 delete를 이용해라. 3. 다음의 사항을 기억해라. - 생성자 각각에서 포인터의 초기화, 만일 특정 생성자에서 메모리 할당되지 않았을 경우 0으로 초기화해라 - 할당 연산자에서 기존 메모리를 삭제하고 새로운 메모리의 할당해라(0값 해체는 아무일도 없음) - 소멸자에서 포인터를 삭제 해라 주의점 1. 클래스 생성시 new를 사용하지 않았다면, delete를 수행하지 말아라. (부득이하게 malloc으로 생성했다면..
이유 1. 메모리 릭 발생되기 때문이다. - new string[100] 했으면 delete []string 해줘야 한다. delete string 하면 100개의 요소중 1개만 해제한다. - 클래스의 객체라면 소멸자 역시 1번만 발생 된다. - typedef 사용시 delete시 착각의 위험에 빠질수 있다. 해결 방법 1. 동일한 형식으로 사용 한다. 2. typedef를 사용 하지 마라! 덧붙여 1. 여러 문자열을 할당받고 싶다면 vector을 사용 해라. 더 편하다
이유 1. malloc과 free는 생성자와 소멸자의 존재자체를 모른다(호출 자체를 안해준다.) 2. 1번의 문제로, 메모리릭 발생 위험이 따른다.(사용자가 간과했다간) 3. 1번의 문제로, 초기화 작업을 부수적으로 해야 한다. 4. 1번의 문제로 , 가독성을 떨어뜨릴수 있다(new와 malloc의 혼용 사용으로) 해결방법 1. 혼용 사용을 왠만해선 하지 마라 2. new와 delete를 사용 해라
최근댓글