프로그래밍
-
[c++11] std::weak_ptr의 사용프로그래밍/c++ 2015. 7. 23. 12:30
weak_ptr약한 포인터(weak pointer)에 관한 설명으로 흔히 사용되는 말은 shared_ptr로 연결된 자료구조의 포인터 참조 고리를 끊기 위해서라는 것이다. 나는 weak_ptr를 다음과 같이 설명하는 편이 더 나을 것이라고 생각한다.포인터가 존재할 경우에만 참조해야 하고(다른 누군가에 의해) 삭제될 수 있으며마지막으로 사용된 후에는 소멸자가 호출되어야 하는(그래서 자신이 할당했던 익명 메모리 공간을 제거해야만 하는) 포인터고전 게임인 "행성 게임(asteroid game)"을 구현해야 한다고 생각해 보자. 모든 행성은 게임에 의해 관리되지만 행성 사이의 충돌을 처리하기 위해서 이웃 행성 정보도 관리해야 한다. 행성이 충돌하면 보통 하나 이상의 행성이 소멸된다. 이러한 이웃 행성 목록을 관..
-
asio udp client 작업 중 람다 캡처를 잘못 사용한 문제프로그래밍/의문 2015. 7. 14. 18:51
123456789101112131415161718void UdpClient::Send(const ip::udp::endpoint& endpoint, const void* source, size_t bytes){ std::vector sendBuffer; sendBuffer.resize(bytes); std::memcpy(sendBuffer.data(), source, bytes); socket.async_send_to( buffer(sendBuffer.data(), sendBuffer.size()), // send data endpoint, [this, buf = std::move(sendBuffer)](const boost::system::error_code& error, size_t bytes){ /..
-
c++11에 추가된 override 키워드와 필요성프로그래밍/c++ 2015. 7. 13. 00:13
Session을 상속받는 MySession이라는 클래스가 있다고 하자. MySession 클래스는 Session의 OnReceive 함수를 재정의 하려고 했다. 1234567class MySession : public Session{public: virtual void OnReceive() { }};cs 하지만 Session의 OnReceive의 정의는 이와 달랐다. 1234567class Session{public: virtual void OnReceive(const void* buffer, size_t bytes) { }};Colored by Color Scriptercs 이 경우 OnReceive는 Session의 OnReceive 재정의가 아닌, MySession 클래스에서 새롭게 정의된 가상함수..
-
C++ STL replaceAll. string 공백/개행 등 패턴 문자 제거프로그래밍/c++ 2015. 6. 10. 11:39
C++ STL의 string을 이용해서 구현한 replace all 함수입니다. using namespace std; string replaceAll(const string &str, const string &pattern, const string &replace) { string result = str; string::size_type pos = 0; string::size_type offset = 0; while((pos = result.find(pattern, offset)) != string::npos) { result.replace(result.begin() + pos, result.begin() + pos + pattern.size(), replace); offset = pos + replac..
-
구글 C++ 스타일 가이드의 멤버 변수 네이밍 규칙을 따르지 않아야겠다고 생각한 이유프로그래밍/c++ 2015. 5. 23. 23:47
언젠가 본 구글 C++ 스타일 가이드에선 멤버 변수의 끝에 _를 붙이는걸 권하고, 헝가리안 표기법은 쓰지 않으며, 멤버 함수(메소드)는 파스칼 네이밍을 쓴다고 들었다. 난 그것이 객관적으로 옳은 쪽에 가깝다고 생각하여 익숙해지려고 그 이후의 모든 코딩에 해당 방식을 적용했지만 멤버 변수의 끝에 _를 붙이는 네이밍은 이러한 이유로 납득이 가지 않는다고 생각했다. 클래스 내부에서 m_을 쓰면 멤버 변수만이 쭈르륵 뽑힌다. 반면 멤버 변수 뒤에 _를 붙이는 방식은 그러한 것들을 보여주는 데에서 유리하지 않다. this를 사용하면 괜찮지 않느냐? 하지만 , 다음과 같이 멤버 함수와 멤버 변수가 함께 잡힌다 지금은 멤버 변수에 m_을 붙이는 형태로 바꿔서 그렇지 그렇지 않았다면 나열 순서도 뒤죽박죽 섞였겠지. C..
-
C++ 서버 프레임워크 제작 중 연산자 재정의로 인해 발생한 버그프로그래밍/의문 2015. 5. 23. 23:20
123456789101112131415161718void User::Receive(){ DWORD recvBytes; DWORD flags = 0; SOCKET s = m_socket; auto bytesTransferred = WSARecv( m_socket,//m_socket.GetNativeSocket(), &m_receiveBuffer.wsaBuffer, 1, &recvBytes, &flags, &m_overlapped, NULL); // ...}Colored by Color Scriptercs 문제는 저 부분이었다. m_socket. 여기서 m_socket의 정의는 Nelta::StreamSocket m_socket이다. StreamSocket은 윈도우 소켓을 다루는 게 서툴렀던 내가 TCP 소..
-
unsinged int와 size_t프로그래밍/c++ 2015. 3. 31. 14:55
http://en.cppreference.com/w/c/types/size_t size_t란? size_t는 부호 없는 정수형(unsinged integer)으로 sizeof, alignof, offsetof의 반환 값입니다. auto result = sizeof(very_very_big_object); 이론적으로 가능한 오브젝트의 최대 크기를 저장할 수 있는 타입이며 일반적으로, 배열 인덱싱 및 루프 계산에 사용됩니다. 이럴 때 쓴다! size_t는 이론적으로 가능한 오브젝트의 최대 크기라고 한다. malloc같은 C의 메모리 할당 함수를 보면 인자의 타입으로는 size_t를 사용하는데, int형, short형 같은 원초적 자료형들은 크기가 고정적이다. int는 4, short는 2로. 이런 고정적인 ..
-
배열의 최대 길이에 관하여프로그래밍/c++ 2015. 3. 31. 13:05
왜 하필 배열의 길이가 0x7fffffff 바이트를 초과할 수 없다고 했을까 더군다나 heap 메모리에 생성되는 것인데..? 현대의 운영체제는 메모리가 부족하면 하드디스크를 램으로도 사용한다고 들었다. 사실 배열의 최대 크기는 사실 ptrdiff_t과 관계가 있다. 31라인의 0x7fffffff은 현재 내 시스템에서의 ptrdiff_t에 오버플로우가 없이 저장이 가능한 최대의 값이다. ptrdiff_t은 포인터간의 거리를 저장하는데 쓰이는 타입으로, 부호 있는 정수형의 최대 값으로 재정의 되어있다. #ifdef _32비트_시스템_ typedef ptrdiff_t long; #elif _64비트_시스템_ typedef ptrdiff_t long long; .. 이런 식으로 여기서 그냥 int라고 하지 않는..