unique_ptrC++에서 메모리를 잘못된 방식으로 관리하였을 때 크게 두 가지 종류의 문제가 발생메모리 누수, 메모리를 사용하고 해제 하지 않음 - RALL 패턴을 사용하면 해결 가능해제한 메모리를 다시 참조 Data* data = new Data();Date* data2 = data;// data 의 입장 : 사용 다 했으니 소멸시켜야지.delete data;// ...// data2 의 입장 : 나도 사용 다 했으니 소멸시켜야지delete data2;위 문제가 발생한 이유는 만들어진 객체의 소유권이 명확하지 않았기 때문포인터에 객체의 유일한 소유권을 부여하면 해결 가능이 포인터 외에 객체를 소멸시킬 수 없다고 하면 double free는 발생하지 않음#include #include class A ..
분류 전체보기
C style type castingC 스타일로 형 변환을 하게 된다면 코딩 과정에서 실수를 하여도 컴파일러가 잡아내지 못하는 문제가 있다.C 스타일로 형 변환을 지시하면 컴파일러는 맞는 형 변환인지 판단하지 않는다.부모 객체를 자식 객체로 형 변환시 문제가 발생할 수 있음컴파일러는 프로그래머의 실수를 지적하고 싶지만, C 스타일 형 변환 연산은 잘못되었는지 지적할 수 없다.C++ 변환 연산자C++에서는 4 개의 연산자를 통해 용도에 맞는 형 변환 연산자의 사용을 유도한다.static_castconst_castdynamic_castreinterpret_castdynamic_cast : 상속관계에서의 안전한 형 변환dynamic_cast 형 변환 연산자는 다음의 형태를 갖는다.dynamic_cast(exp..
exception프로그램의 실행 도중에 발생하는 문제 상황컴파일 시 발생하는 문법적인 에러는 예외의 범주에 포함되지 않음예외 상황의 예시나이를 입력하라고 했는데, 0보다 작은 값이 입력나눗셈을 위한 두 개의 정수를 입력 바든데, 제수(나누는 수)로 0이 입력주민등록번호 13자리만 입력하라고 했더니, 중간에 -를 포함하여 14자리를 입력예외는 문법적인 오류가 아닌, 프로그램의 논리에 맞지 않는 상황을 의미#include int main(){ int num1, num2; std::cout > num1 >> num2; std::cout try, catch, throw예외처리에서 익숙해져야 할 세가지 키워드trycatchthrowtry 블록try 블록은 예외 발생에 대한 검사의 범위를 지정할 때..
varidic templateC++에서도 파이썬의 출력문을 동일하게 구현할 수 있다.C++의 템플릿을 이용하면 임의의 개수의 인자를 받은 함수를 구현할 수 있다.#include templatevoid print(T arg){ std::cout void print(T arg, Types... args){ std::cout typename뒤에 ...으로 오는 것을 템플릿 파라미터 팩이라고 부른다.템플릿 파라미터 팩의 경우 0개 이상의 템플릿 인자들을 나타낸다.함수에 인자로 ...으로 오는 것을 함수 파라미터 팩이라고 부른다.템플릿 파라미터 팩과 함수 파라미터 팩의 차이점템플릿의 경우 앞에 ...함수의 경우 뒤에 ...파라미터 팩은 추론된 인자를 제외한 나머지 인자들을 나타내게 된다.print(1,..
templateC++에서는 template라는 이름으로 원하는 자료형에 따라 코드가 나오는 틀을 만들 수 있다.template위 선언 아래에 정의되는 클래스에 대해 템플릿을 정의하는 코드템플릿 인자로 T를 받게 되며, T는 반드시 타입 이름임을 명시하고 있다.만약 밑에 오는 것이 함수일 경우 함수에 대한 템플릿이 된다.참고template라고 쓰는 경우도 있지만, typename T와 동일정의한 템플릿의 인자에 값을 전달하기 위해서는MyTemplate intTemplate;와 같이 안에 전달하려는 것을 명시클래스 템플릿에 인자를 전달해서 실제 코드를 생성하는 것을 클래스 템플릿 인스턴스화(class template instantiation)라고 한다.템플릿이 인스턴스화 되지 않고 덩그러니 있다면 컴파일 시..
다중 상속 (Multiple inheritance)C++은 다중 상속을 지원한다.하나의 클래스가 다른 여러 개의 클래스들을 상속 받는 것을 허용class A {public: int a;};class B {public: int b;};class C : public A, public B {public: int c;};위 경우, 클래스 C가 A와 B로 부터 동시에 같이 상속 받고 있음A와 B의 내용이 모두 C에 들어가 있다.C c;c.a = 3;c.b = 2;c.c = 4;와 같은 것이 가능하게 된다.다중 상속에서 생성자의 호출 순서는 상속 받은 순서에 의해 결정된다.위 코드의 경우 A가 가장 먼저 상속받았으므로 A -> B -> C 순서로 호출된다.만약 상속 순서가 B가 먼저로 바뀌면 B -..
explicit#include class MyString { char* content; int contentLength; int contentCapacity; public: MyString(int capacity); // capacity 만큼 빈배열 생성 MyString(const char* str); // str의 길이만큼 빈배열 생성 후 삽입 MyString(const MyString& str); // 복사 생성자 ~MyString(); // 소멸자};// 구현 생략int main(){ MyString s(3);}위 코드와 같이 MyString 클래스가 존재한다. 만약 아래와 같이 MyString 객체를 인자로 받는 함수가..
레퍼런스(Reference)C언어에서는 어떠한 변수를 가리키고 싶을 땐 반드시 포인터를 사용하지만, C++에서는 다른 변수나 상수를 가리키는 방법으로 참조자라는 또다른 방식을 제공#include int main(){ int a = 3; int& anotherA = a; anotherA = 5; std::cout a의 참조자 antoherA를 정의함가리키고자 하는 타입 뒤에 &를 붙이면 된다.anotherA는 a의 또다른 이름이라고 컴파일러에게 알려주는 것anotherA에 어떠한 작업을 수행하든 사실상 a에 그 작업을 하는 것포인터와의 차이점레퍼런스는 포인터와 상당히 유사하지만 레퍼런스는 몇가지 중요한 차이점이 있다.레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정레퍼런스..