많은 요소, 특히 unsigned char * 유형의 요소가 두 개 포함 된 SFrame이라는 구조체가 있습니다. 내 클래스 에서이 구조체의 멤버 변수를 만들지 만, 새로 추가 된 클래스의 함수에서 각 반복마다 (특정 부울이 참일 때를 제외하고) 새로 초기화합니다. 요소의 일부를 할당하는 함수에 복사 생성자/배열 삭제로 인한 메모리 손상?
if (false == m_bRemainderNeedsProcessing)
{
// ... calls before and after the initialization are unimportant and not shown
m_sFrame = SFrame();
}
가 그럼 난 m_sFrame을 통과 한 후 내 구조체 내 pszMessage 변수에 부호없는 문자 배열을 할당해야합니다 : 나는 다음과 같은 방법으로이 작업을 수행.
m_sFrame.iMessageSize = m_sFrame.iPayloadLength;
m_sFrame.iOriginalMessageSize = m_sFrame.iPayloadLength;
m_sFrame.pszMessage = new unsigned char[m_sFrame.iPayloadLength + Constants::RSSL_DECODE_PADDING];
m_sFrame.pszOriginalMessage = new unsigned char[m_sFrame.iPayloadLength + Constants::RSSL_DECODE_PADDING];
이 SFrame 인스턴스
는std::vector<SFrame>;
내가 각 반복에 대한 m_sFrame를 재사용 할 수 있도록하려면 즉 SFrames의 벡터에 저장하지만 난 내용을 지우려고하면되도록해야 SFrame을 벡터 안에 저장하면 SFrame은 할당 된 값을 잃지 않고 벡터에 복사됩니다. 이를 위해 SFrame의 복사 생성자를 만듭니다.
SFrame의 복사 생성자 이미지를 첨부했습니다. ClearMemory 기능은 다음 않는 경우
ClearMemory(m_sFrame.pszMessage);
: 내 함수의 끝에
, 나는 다음을 수행하여 pszMessage의 메모리 (거의 동일하다 pszOriginalMessage)를 지울void CPCAPParser::ClearMemory(unsigned char *pszBuffer)
{
if(pszBuffer != NULL)
{
delete [] pszBuffer;
}
}
그대 문제는이 함수가해야 할 이상을 삭제하는 것입니다 .... 많은 반복 후, 나는 처리되지 않은 예외 얻을 수 있기 때문에 : 액세스 위반 ...
문제점을 전달하는 데 도움이되는 몇 가지 이미지를 첨부했습니다. 사람이 자세한 내용을 알려 추가하는 저를 필요로하는 경우 정말,이 :(도움이 필요
감사
을http://imageshack.com/f/pduGDLGZp (상수 :: RSSL_DECODE_PADDING 길이 7을 가지고 이렇게 설정 한 총 13 바이트가 있습니다. - . 메모리 블록의 시작)
http://imageshack.com/f/exRaaEmip에 분명했다 - 나는 ClearMemory를 호출하고 (메모리 주소)는 여전히 분명 동일
내가 더 많은 이미지를 게시 할 것입니다하지만 난 충분히 담당자가 없습니다. ...
SFrame :
struct SFrame
{
int* ipTemp_int_ptr;
int* ipTemp_int_ptr_actual;
int* piTimestampPos;
int* piOffset;
int iIP_Header_Length;
int iTCP_Header_Length;
int iTCP_Source_Port;
int iTCP_Dest_Port;
long long uiSequenceNumber;
long long uiInitialSequenceNumber;
long long uiAckNumber;
int iIp_total_length;
int iActual_frame_length;
int iOriginal_frame_length;
int iCaptured_frame_length;
int iTotalPayloadLength;
int iTotalMsgLoad;
int iPayloadLength;
int iBytesComplete;
int iFragmentID;
int iRemainder;
int iMessageSize;
int iOriginalMessageSize;
long long iNextExpectedSequenceNum;
std::string strSourceAddress;
std::string strDestAddress;
std::string strTimestamp;
unsigned char* pszMessage;
unsigned char* pszOriginalMessage;
unsigned int uiClientID;
int iStartOfRemainder;
int iAccumulatedMsgLength;
SFrame() : ipTemp_int_ptr (NULL),
ipTemp_int_ptr_actual (NULL),
piTimestampPos (NULL),
piOffset (NULL),
pszMessage (NULL),
pszOriginalMessage (NULL),
iIP_Header_Length(0),
iTCP_Header_Length (0),
iTCP_Source_Port (0),
iTCP_Dest_Port (0),
iIp_total_length (0),
iActual_frame_length (0),
iOriginal_frame_length (0),
iCaptured_frame_length (0),
uiSequenceNumber(0),
uiInitialSequenceNumber (0),
uiAckNumber(0),
iPayloadLength (0),
iNextExpectedSequenceNum (0),
uiClientID (0),
iMessageSize (0),
iOriginalMessageSize (0),
iFragmentID(0),
iTotalPayloadLength(0),
iBytesComplete(0),
iAccumulatedMsgLength (0),
iRemainder (0),
iStartOfRemainder(0),
iTotalMsgLoad (0)
{
}
SFrame(const SFrame &c_rSrc)
{
*this = c_rSrc;
}
SFrame &SFrame::operator=(const SFrame &c_rSrc)
{
iIP_Header_Length = c_rSrc.iIP_Header_Length;
iTCP_Header_Length = c_rSrc.iTCP_Header_Length;
iTCP_Source_Port = c_rSrc.iTCP_Source_Port;
iTCP_Dest_Port = c_rSrc.iTCP_Dest_Port;
iIp_total_length = c_rSrc.iIp_total_length;
iActual_frame_length = c_rSrc.iActual_frame_length;
iOriginal_frame_length = c_rSrc.iOriginal_frame_length;
iCaptured_frame_length = c_rSrc.iCaptured_frame_length;
iPayloadLength = c_rSrc.iPayloadLength;
uiSequenceNumber = c_rSrc.uiSequenceNumber;
uiInitialSequenceNumber = c_rSrc.uiInitialSequenceNumber;
uiAckNumber = c_rSrc.uiAckNumber;
iNextExpectedSequenceNum = c_rSrc.iNextExpectedSequenceNum;
uiClientID = c_rSrc.uiClientID;
iFragmentID = c_rSrc.iFragmentID;
iMessageSize = c_rSrc.iMessageSize;
iOriginalMessageSize = c_rSrc.iOriginalMessageSize;
iTotalPayloadLength = c_rSrc.iTotalPayloadLength;
iBytesComplete = c_rSrc.iBytesComplete;
iAccumulatedMsgLength = c_rSrc.iAccumulatedMsgLength;
iRemainder = c_rSrc.iRemainder;
iStartOfRemainder = c_rSrc.iStartOfRemainder;
iTotalMsgLoad = c_rSrc.iTotalMsgLoad;
strSourceAddress = c_rSrc.strSourceAddress;
strDestAddress = c_rSrc.strDestAddress;
strTimestamp = c_rSrc.strTimestamp;
pszMessage = (c_rSrc.pszMessage == NULL) ? NULL : new unsigned char[c_rSrc.iMessageSize];
pszOriginalMessage = (c_rSrc.pszOriginalMessage == NULL) ? NULL : new unsigned char[c_rSrc.iOriginalMessageSize];
if(pszMessage != NULL)
{
memcpy(pszMessage, c_rSrc.pszMessage, c_rSrc.iMessageSize);
}
if(pszOriginalMessage != NULL)
{
memcpy(pszOriginalMessage, c_rSrc.pszOriginalMessage, c_rSrc.iOriginalMessageSize);
}
return *this;
}
~SFrame()
{
delete [] pszMessage;
delete [] pszOriginalMessage;
}
};
왜 멤버가'std :: vector'대신 포인터가 되는가? –
PaulMcKenzie
http://imageshack.com/f/idjwk2pEp –
어느 멤버 Paul ... ... –