나는 OverLapped 구조체를 상속 받은 구조체나 클래스에 대해서 초기화를 할 때
생성자에 memset(this, NULL, sizeof(*this)) 로 초기화를 하고 있었는데.. 이 방법은 상당히 편하다..
다른 멤버 변수에 굳이 지정을 해주지 않아도 한 줄로 끝내버릴 수 있는 강력함을 가지고 있다.
1 2 3 4 5 6 7 8 9 10 | struct Data : public OVERLAPPED { int a; char buf[10]; Data(){ memset(this, NULL, sizeof(*this)); } } | cs |
이렇게 말이다..
그런데 이 방법을 즐겨 쓰다보면 생각보다 위험성이 크고 이러한 방법에 대해서 문제가 발생할 시 아무리 오류가 나는 지점에서 디버깅을 하고 또하고 또또또또또또 해봤자 이유를 못찾을 것이다..
때문에 이런 방법을 썼을 경우 나타날 수 있는 문제점에 대해서 서술하고자 한다.
1. 멤버이니셜라이즈..
1 2 3 4 5 6 7 8 9 10 11 12 13 | class test { SOCKET sock; test(SOCKET sock) : sock(sock){ memset(this, NULL, sizeof(*this)); } }; | cs |
가지고 있던 sock 이 날라가버린다. 이니셜라이즈로 할당을 한 것을 날려버리는 셈이 되는 것이다..
2. 가상함수를 상속 받은 클래스 초기화
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class test { public: test(){ } virtual void hello() { }; }; class test2 { int a; public: test2(){ memset(this, NULL, sizeof(*this)); } void hello() { printf("Hello"); } } | cs |
test2 는 몇 바이트를 가지고 있을까 ?
==>> sizeof(test2) 는 8 바이트이다... int a 는 4바이트를 가지고 있지만 나머지 4바이트는 어디서 나온걸까..
바로 가상함수 테이블이다.. 가상함수를 상속받게 되면 자식은 가상함수 테이블을 가져가게 된다.
때문에 자식 객체에서 생성자부분에서 memset으로 크기만큼 초기화 해버리면 가상함수테이블의 내용까지 날려버리기 때문에
후에 test2를 통해 hello 라는 함수에 대해서 접근할 때 접근 할 수 없게 된다..
3. stl .. set , unorderedset 사용시 문제점..
위와 같이 std::set을 멤버 변수로 가지고 있는 클래스에서 생성자에서 memset 을 초기화 하니 set에서는 Root 오류가 뜨고 unorderedset 에서는 outofrange 같은 오류가 난다..
'서버프로그래밍' 카테고리의 다른 글
| 서버분산 동영상 1차. (0) | 2019.03.10 |
|---|---|
| 졸업작품 - 분산 서버를 위한 서버간 터미널 통신 영상 (0) | 2018.12.17 |
| c++ thread 를 사용하기 위한 방법들 나와있는 페이지 (0) | 2018.11.02 |
| Singleton 과 Friend (0) | 2018.11.01 |
| 짬내서 만드는 IOCP 채팅과제 - 1 (0) | 2018.10.30 |