이진 파일에서로드 된 대량의 메모리를 보편화하고 메시지 ID를 알고 싶습니다. 각 메모리 덩어리에 대해 새 인스턴스를 만들어야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?이런 종류의 스위치 케이스를 제거하는 방법은 무엇입니까?
현재 상황은 다음과 같은 스위치 케이스에 새로 추가 된 각 메시지 유형을 추가해야합니다.
struct Message1;
struct Message2;
void UnSerialize(int messageId, void* data) {
switch (messageId) {
case MESSAGE1:
Message1* m1 = new Message1;
std::memcpy(m1, data, sizeof(Message1));
m1.dump();
delete m1;
break;
case MESSAGE2:
Message2* m2 = new Message2;
std::memcpy(m2, data, sizeof(MESSAGE2));
m2.dump();
delete m2;
break;
default:
std::cout << "Unknown Message Type.";
break;
}
}
내가 C++에서 다음과 같이 작성할 수 있습니까? C++ 11 및 부스트없이 가능합니까?
는'UnSerialize'는 해당 가상 귀하를 'UnSerialize (MessageTypeList tl, int messageId, void * data) {}'를 무효화합니다. 메모리 누출 이상의 부작용이 없습니다. 그 점에 대해서는 원래의'void UnSerialize (int messageId, void * data)'도 마찬가지였습니다. 그 모든 할당 된 기억에 어떤 일이 일어나기로되어 있습니까? –
메시지가 switch 문에서 만들어진 후 어떻게됩니까? 당신이 memcpy를하고 있다면, 왜 메시지의 유형이 중요합니까? (클래스의 memcpy는 매우 나쁠 수있다). –
코드가 유효하지 않습니다.'memcpy'는 포인터의 크기를 복사하고 있습니다. 'new Message1; '은 불완전한 타입들에서도 작동하지 않습니다. 분명히 이유없이 동적 할당을 사용합니다. –