목록Language (73)
Coding Memo
Summaryconst로 선언된 포인터는 포인터 값 뿐만 아니라, 해당 포인터가 가리키는 데이터의 변경도 막는다. 따라서 const 변수와 마찬가지로, const 포인터는 const가 아닌 값으로 캐스팅 할 수 없다. const로 선언된 포인터는 해당 포인터가 가리키는 데이터의 변경을 막는다. 만약, const 포인터가 가리키는 값을 변경할 필요가 있는 경우, `const_cast`를 사용하여 const 속성을 없애주면 된다.다음은 예시 코드이다.using uint = unsigned int;using ubyte = unsigned char;uint t = 0xffffffff;std::cout someInt(4, 0xFF); // it represents max of unsigned int { uby..
일단은 해당 내용은 에러나 경고로 나타나지 않고, 단순히 output에서 나타난 일종의 메시지 이다.the template instantiation context (the oldest one first) is 1> ...Session.cpp(49,23): 1> see reference to function template instantiation 'std::shared_ptr NetCore::make_shared,NetCore::_ubyte*&,const size_t&>(std::shared_ptr &&,NetCore::_ubyte *&,const size_t &)' being compiled 1> with 1> [ 1> _Ty=NetCore::Send..
상황 GetQueuedCompletionStatus()가 성공적으로 완료되었음에도 불구하고, Overlapped 구조체의 값이 이상했다. (기대했던 값이 아니었다.) GetQueuedCompletionStatus를 호출한 HANDLE에 `connectEvent`라는 overlapped를 상속하는 구조체가 연결되어 있는 파일 핸들을 등록했다. 따라서 GetQueuedCompletionStatus가 성공적으로 완료되었다면, 인자로 넣어주었던 LPOVERLAPPED*가 이 connectEvent를 가리키는 포인터가 되어야 된다. 그러나 이 포인터는 메모리 오염이 일어난 듯 값이 이상했다. 먼저, IOCPEvent와 ConnectEvent는 다음과 같다.// EventType은 unsigned ..
에러 Lock을 이용한 Queue를 만들고 컴파일 중에 발생했다. 일단 에러 내용은 이러하다. 상황 단순히 보면 ReadLock이라는 함수의 인자가 일치하지 않아서 나타나는 문제로 보인다... bool TryPeek(T& top) const { ReadLock __r_lock(_lock); // 문제의 코드 if (_queue.empty()) return false; else { top = _queue.top(); return true; } } 문제가 되는 함수이다. 간단히 설명하면, queue에서 peek을 하기위해 readlock을 걸어두고 queue를 읽는다. class ReadLock { public: ReadLock(Lock& lock) : _lock(lock) { _lock.ReadLock()..
에러 내용 ::WSAGetLastError()로 얻은값이 10022 (WSAEINVAL)값으로 에러가 발생했다. 나의 경우 ConnectEx함수 호출 후, 위 에러가 나타났다. 찾아보니 인수가 잘못되었다는 에러였는데, 도대체 여러개의 인자들 중 무엇이 잘못되었는지 몰라서 당황했다. (필요한 인자가 nullptr도 아니었고, 잘못된 인자가 없었다.) ConnectEx 문서를 보니 바로 이유를 알게 되었다... 해결 ConnectEx에 사용하는 소켓은 반드시 바인딩 되어 있어야 한다. ConnectEx 호출 이전에 소켓에 ::bind를 통해 나중에 연결에 사용될 로컬 주소와 포트를 바인딩해주면 된다. 추가적으로 소켓에 대한 유의 사항을 정리하면 소켓은 바인딩되어 있어야 한다. (주의할 점은 연결 할 엔드포인..
Error Create~~를 이용해 flatbuffer관련 객체나 구조체를 생성할 때 나타나는 에러이다. assert에 의한 에러이다. Problem 다음은 문제의 코드이다. CreateString을 이용해 flatbuffer 문자열을 만드는 중에 에러가 발생했다. #pragma comment(lib, "Release\\flatbuffers.lib") #include "flatbuffers/flatbuffers.h" #include "flatbuffers/util.h" #include "flatbuffers_scehmas/MyGame_generated.h" #include using namespace std; using namespace MyGame; int main() { // error codes {..
가상 소멸자 (virtual destructor)은 C++의 다형성과 관련된 기능 중 하나이다. 다음 코드에서와 같이 기본 클래스 (base class, parent class)에서 파생 클래스 (derived class, child class)의 포인터를 사용할 때, 파생 클래스의 소멸자를 호출하기 위해 가상 소멸자를 사용한다. class Base { }; class Derived : public Base { }; int main() { Base* ptr = new Derived(); // 파생 클래스의 포인터를 기본 클래스 포인터로 저장 /// ... return 0; } 위 코드에서 만약 delete ptr를 한다면 Base의 소멸자만 호출이 된다. 즉, Base에 대한 데이터는 delete 되지만..
C++ 컴파일러는 메모리에 구조체나 클래스를 배치할 때, 반드시 빈공간 없이 빽빽하게 메모리를 사용하지 않는다. 컴파일러는 CPU의 데이터 접근 효율성 향상을 위해 특정한 값으로 정렬을 하여 메모리에 데이터를 배치시킨다. (데이터 형식에 따른 일정한 간격 유지) (예를 들어, int 타입의 데이터는 빠른 메모리 접근을 위해 4배수의 메모리 주소에 저장할 것이다. 이로 인해 이전 메모리 공간에 빈 공간 (padding)이 생길 수 있다.) 만약 위 구조체에서 b가 int 타입이 아닌 double 타입이었다면 b를 8바이트 정렬하기 위해 a이후에 패딩을 추가할 것이다. | a(2) | padding(6) | b(8) | 즉, padding은 다음 순서에 오는 멤버의 데이터의 형식에 따라 존재여부와 사이즈가 ..