我一直在撓我的頭髮,但似乎無法找到以下代碼有什麼問題。這裏是它在0x4c22d82產生無效的讀取大小1 valgrind
尺寸1的讀出無效的valgrind輸出的小片段:strlen的(mc_replace_strmem.c:242) 由0x5E65CA:應用:: readConfigurationFile()(char_traits.h:262)通過0x5694BD:主地址0xafc9660是一個大小爲 39 free'd在0x4C20E0D處的24個字節:操作員刪除(void *) (vg_replace_malloc.c:342)by 0x635618: Configurator :: getParameterValue(char const * char **)by 0x5E65B2: Application:readConfigurationFile()(Application.cpp:77)by 0x5694BD: main
bool Configurator::getParameterValue(const char *p_pParameterName, char** p_pParameterValue)
{
bool blReturnValue = false;
QDomElement element;
QDomNode node;
QDomNodeList list;
list = doc.elementsByTagName(p_pParameterName);
if (!list.isEmpty())
{
node = list.item(0);
element = node.toElement();
QString qs = element.text().toUtf8();
*p_pParameterValue = (char *)(qs.toStdString().c_str());
blReturnValue = true;
}
else
{
char sMessage[200];
sprintf(sMessage, "<Configurator::getParameterValue> Error! Parameter %s could not be found\n", p_pParameterName);
m_outputFunction(sMessage);
}
return blReturnValue;
}
bool Configurator::parseFile()
{
bool blReturnValue = false;
QString errorStr;
int errorLine;
int errorColumn;
if (!doc.setContent((QIODevice*)(&file), true, &errorStr, &errorLine, &errorColumn))
{
char aTemp[512];
sprintf(aTemp, "<Configurator::parseFile> error! can not read the file row: %d, column: %d:\n",errorLine, errorColumn);
m_outputFunction(aTemp);
}
else
{
closeFile();
blReturnValue = true;
}
return blReturnValue;
}
bool Application::readConfigurationFile()
{
bool blReturnValue = false;
m_outputFunction("<Application::readConfigurationFile> Reading configuration..\n");
if(m_configurator.parseFile())
{
blReturnValue = true;
m_configurator.writeParameters();
char *pTemp = 0;
if(!m_configurator.getParameterValue("center_no", m_bCenterNo))
m_bCenterNo = 1;
if(m_configurator.getParameterValue("highway_header", &pTemp))
m_strHighwayHeader.assign(pTemp);
else
m_strHighwayHeader.assign("... HIGHWAY"); // Default value
}
return blReturnValue;
}
有人可以告訴我爲什麼我看到無效的讀取,我甚至沒有在這段代碼中使用malloc/calloc。
感謝您的迴應,所以不要這樣做,我應該使用strncpy,是嗎? – 2012-07-23 12:08:04
@erinc否,那麼你必須分配和釋放內存。我的建議是,你要麼使用對'QString'或'std :: string'的引用。 – 2012-07-23 12:16:37