본문 바로가기

전체 글166

Virtual 베이스클래스에 virtual 키워드로 선언된 메서드만 파생 클래스에서 오버라이드 할 수 있다.C++에서 클래스를 컴파일하면 그 클래스의 모든 메서드를 담은 바이너리 객체가 생성된다. 그런데 컴파일러는 virtual로 선언되지 않은 메서드를 호출하는 부분을 컴파일 시간에 결정된 타입의 코드로 교체한다.이를 정적 바인딩이라고 한다.메서드를 virtual 로 선언하면 vtable 이라 부르는 특수한 메모리 영역을 활용해서 가장 적합한 구현 코드를 호출한다. virtual 메서드가 하나 이상 정의 된 클래스마다 vtable이 하나씩 있는데, 이 클래스로 생성한 객체마다 이 vtable에 대한 포인터를 갖게된다. virtual 메서드의 구현 코드에 대한 포인터는 바로 vtable에 담겨있다. 그래서 객체에 대해 .. 2024. 10. 7.
스마트 포인터 c++ 스마트 포인터가 스코프를 벗어나게 되거나 리셋되면 거기에 할당된 리소스가 자동으로 해제된다.스마트 포인터는 함수 스코프 안에서 동적으로 할당된 리소스를 관리하는데 사용할 수도있고,, 클래스의 데이터 멤버로 사용할 수도있다.동적으로 할당된 리소스의 소유권을 함수의 인수로 넘겨줄 때도 스마트 포인터를 활용한다.std::unique_ptr :고유 소유권 방식 지원앨리어싱 : 어떤 포인터의 복사본을 여러 객체나 코드에서 갖고 있을때.→ 모든 리소스를 제대로 해제하려면 리소스를 마지막으로 사용한 포인터가 해제해야한다. 그런데 코드의 어느 지점에서 그 리소스를 마지막으로 사용하는지 알기 힘들때가 많다.→ 그래서 리소스의 소유자를 추적하도록 레퍼런스 카운팅을 구현한 스마트 포인터도 있다.std::shared_ptr .. 2024. 10. 7.
memory leak detection #define _CRTDBG_MAP_ALLOC#include#include#ifdef _DEBUG #ifndef DEBUG_NEW #define DBG_NEW new ( _NORMAL_BLOCK, __FILE__, __LINE__) #define new DBG_NEW #endif#endifint main(){ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);} 2024. 10. 2.
C++ 상속 날씨 예보를 위한 WeatherPrediction 클래스class WeatherPrediction{public: virtual void setCurrentTempFahrenheit(int inTemp); virtual void setPositionOfJupiter(int inDistanceFromMars); virtual int getTomorrowTempFahrenheit(); virtual double getChanceOfRain(); virtual void showResult(); virtual std::string getTemperature() const;protected: int mCurrentTempFahrenheit; int mDistanceFromMars;};#include "Weather.. 2024. 10. 2.