본문 바로가기

Programming/C&CPP

얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) 객체를 생성하고 대입하게 되면 복사 생성자가 호출되어 값을 복사하게 됩니다.클래스의 복사 생성자는 별도로 정의하지 않아도 생성되는 특수한 함수입니다.이렇게 기본적으로 내부에 생성되는 복사 생성자는 int 등의 타입에는 정상적으로 동작합니다.하지만 다음과 같이 포인터 등을 사용할 경우에는 문제가 발생할 소지가 있습니다. #include #include class Person { public: Person(int nAge, char* pName) { m_Age = nAge; int nLen = strlen(pName) + 1; m_Name = new char[nLen]; strncpy(m_Name, pName, nLen); } ~Person() { if (nullptr != m_Name) { delete[].. 더보기
new 사용시 예외 처리 new는 C++에서 객체의 메모리 할당과 생성자 호출을 통한 초기화를 담당합니다. C의 malloc, calloc은 메모리 할당에 실패하게 되면 NULL을 리턴해줍니다. 하지만 new는 메모리 할당에 실패했을 때 NULL을 리턴하지 않습니다. 따라서 다음과 같이 예외 처리를 할 경우에는 정상적으로 동작하지 않습니다. 잘못된 코드 #include using namespace std; void main() { char* pData = new char[0x7FFFFFFF]; if (nullptr == pData) { cout 더보기
스마트하지 못한 스마트한 포인터 auto_ptr C/C++은 메모리 관리가 까다로운 언어입니다.개발자가 직접 메모리를 할당하고 해제해야 할 책임이 있습니다.C++의 STL에는 auto_ptr이라는 스마트 포인터가 존재합니다.다만 auto_ptr은 C++11 이후에는 사라졌기 때문에 사용이 불가능합니다.auto_ptr은 헤더에 구현되어 있습니다.auto_ptr이 스마트하지 못한 이유를 확인해 보겠습니다.auto_ptr은 템플릿 기반이기 때문에 어떤 타입의 포인터든지 받을 수 있습니다.클래스의 큰 특징은 객체가 지정된 범위(Scope)를 벗어나면 소멸자가 호출된다는 점입니다.이러한 특징을 통해서 클래스는 객체가 사라지기 전에 정리하거나 해제해야 할 것을 소멸자에서 호출합니다.메모리를 할당하고 해제하지 않으면 메모리 누수(Memory Leak)가 발생합니다.. 더보기
C++ 변환 연산자(Conversion operator) C++ 클래스에는 변환 연산자라는 특수한 형태의 함수(메소드)를 정의할 수 있습니다.이전에 포스팅한 변환 생성자와 반대되는 개념입니다.변환 생성자에 대한 설명은 아래 링크에서 확인 가능합니다.2014/12/08 - [Programming/C&C++] - C++ 변환 생성자(Conversion Constructor)변환 생성자는 일반 타입에서 클래스의 객체를 생성하는 역할을 하지만변환 연산자는 반대로 객체에서 일반 타입 값을 받을 수 있습니다.변환 연산자는 operator 타입명(); 과 같은 형태로 선언이 가능합니다. #include using namespace std; class Distance { private: int kilometer, meter; public: Distance() : kilome.. 더보기
C++ 변환 생성자(Conversion Constructor) 변환 생성자는 기본 타입을 이용해서 객체를 생성하는 생성자입니다.다음 소스 코드를 보도록 하겠습니다. #include using namespace std; class Distance { private: int kilometer, meter; public: Distance() : kilometer(0), meter(0){} Distance(int newDist) { kilometer = newDist / 1000; meter = newDist % 1000; } void PrintDistance() { cout 더보기
가변 인자 함수의 사용법(vprintf, vsprintf) 가변 인자 함수의 내부 구조에 이어서 가변 인자 함수의 사용법을 보도록 하겠습니다.가변 인자 함수의 내부 구조는 다음과 같은 링크에서 확인이 가능합니다.2014/12/07 - [Programming/C&C++] - 가변 인자(Variable Arguments) 내부 구조printf와 유사한 형식으로 문자를 조립해 주는 다음과 같은 함수가 존재합니다.int __cdecl vprintf(const char * _Format, va_list _ArgList); int __cdecl vsprintf(char * _Dest, const char * _Format, va_list _Args);vprintf는 printf와 유사한 동작 방식이고 vsprintf는 sprintf와 유사한 동작 방식입니다.다음의 소스 코.. 더보기
가변 인자(Variable Arguments) 내부 구조 가변 인자 함수는 printf 같이 인자의 형식이나 수가 정해지지 않은 형식의 함수입니다. 제가 예전에 함수 호출 규약을 설명하면서 __cdecl로 호출되는 함수는 가변 인자 함수 호출 방식이라고 설명을 드리면서 호출하는 쪽에서 스택을 정리한다고 했습니다. 이유는 호출당하는 함수에서는 몇 개가 넘어오는 지 알 수가 없기 때문입니다. 혹시 모르시는 분들은 아래 링크를 확인해주세요.2014/11/25 - [Programming/C&C++] - Calling Convention(함수 호출 규약)가변 인자 함수는 말그대로 인자를 변경 가능할 수 있다는 의미입니다. 가장 자주 사용하게 되는 것은 printf류의함수가 아닐까 생각됩니다. Visual Studio에서 printf를 입력해 보았습니다. const ch.. 더보기
C++의 캐스트(Cast) 연산자 C의 타입 캐스팅(형변환)은 명시적, 암시적으로 이뤄집니다. int i = 3.5; int i = 0; double d = 3.5; i = (double)d; 암시적 캐스팅은 Data의 손실이 발생할 수 있기 때문에 문제가 될 수도 있습니다.Visual C++에서는 int i = 3.5 데이터의 손실이 있을 수 있다는 다음과 같은 경고를 보여줍니다.Warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of dataC에서의 타입 캐스팅은 너무나 유연해서 문제가 될 소지가 너무 많습니다.int형 변수의 값을 주소값을 넣는 부분에 넣을 수도 있는데 컴파일러는 군말없이 그냥 다 형변환 해줍니다.그래서 C++에서는 다음의 .. 더보기