C语言-含有指针的结构体浅拷贝注意事项

浅拷贝指针覆盖问题。

下边代码包含:

1,结构体CHSYS_AV_DecParam

2,CHSYS_AV_DecParam的变量m_paramDec

3,函数Create

有两点需要注意:

第一:判断if (pParam != &m_paramDec)如果不进行判断,如果pParam == &m_paramDec,直接删除m_paramDec.pExtradata会导致pExtradata数据的丢失。

第二:删除指针m_paramDec.pExtradata必须在浅拷贝m_paramDec = *pParam之前。删除如果放在浅拷贝之后,实际删除的是pParam->pExtradata,如果不删除可能会造成内容泄漏。

typedef struct _CHSYS_AV_DecParam_{
	unsigned char*  pExtradata;
	int             nExtradataLen;
}CHSYS_AV_DecParam;

CHSYS_AV_DecParam	m_paramDec;
int Create(CHSYS_AV_DecParam* pParam)
{
	if (pParam != &m_paramDec)
	{//如果相同,会造成m_paramDec.pExtradata丢失。
		SAFE_DELETE_ARRAY(m_paramDec.pExtradata);//下边浅拷贝前销毁
		m_paramDec = *pParam;
		if (pParam->nExtradataLen > 0)
		{
			m_paramDec.pExtradata = NEW unsigned char[pParam->nExtradataLen];
			if (m_paramDec.pExtradata != NULL)
			{
				memcpy(m_paramDec.pExtradata, pParam->pExtradata, pParam->nExtradataLen);
				m_paramDec.nExtradataLen = pParam->nExtradataLen;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/knowledgebao/article/details/84346199