c++中字符串相关函数的内存泄漏
Memory leak with string related function in c++
以下函数导致我的代码发生内存泄漏。你能帮帮伙计们吗,当它出错的时候?我认为当我们使用字符串时应该没有泄漏,因为 STL 将负责内存堆分配并且 reallocation.Please 给我一些预感
int CProcessMgr::readField(std::string currlocline)
{
//std::string currlocline = currline;
if((currlocline.find('[') != -1) && (currlocline.find(']') != -1))
{
currlocline.erase(std::remove(currlocline.begin(), currlocline.end(), '['), currlocline.end());
currlocline.erase(std::remove(currlocline.begin(), currlocline.end(), ']'), currlocline.end());
size_t loc = currlocline.find(" ");
m_inpData.updateDate = currlocline.substr(0, loc);
m_inpData.updateTime = currlocline.substr(loc+1);
//GetTimeValues(currlocline.c_str());
}
else if(currlocline.find(SYMBOL_ROW) != -1)
{
size_t size = currlocline.find(":");
if(size != -1)
{
string currticker = currlocline.substr(size+1);
size = currticker.find("bk.HKd");
if(size != -1)
{
m_inpData.ticker = currticker.substr(0, size);
m_inpData.ticker.append(".HK");
}
else
m_inpData.ticker = currticker;
}
}
else if(currlocline.find(TOTAL_VOL) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.totalVolume = atol(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(BID_ROW) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.bidPrice = atof(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(BID_SIZE) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.bidsize = atoi(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ASK_ROW) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.askPrice = atof(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ASK_SIZE) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.asksize = atoi(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ROW80_3_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_3 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_4_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_4 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_5_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_5 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_6_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_6 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_7_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_7 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_8_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_8 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_9_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_9 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_10_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_10 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_11_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_11 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_12_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_12 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_13_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_13 = currlocline.substr(size+1).c_str();
}
return 0;
}
您好,我已经解决了这个问题,感谢您到目前为止的回复。
问题出在结构的 memset 上。由于这个 memset,每次我访问这个代码块时,它们都会创建内存。我正在删除该声明,它看起来不错
以下函数导致我的代码发生内存泄漏。你能帮帮伙计们吗,当它出错的时候?我认为当我们使用字符串时应该没有泄漏,因为 STL 将负责内存堆分配并且 reallocation.Please 给我一些预感
int CProcessMgr::readField(std::string currlocline)
{
//std::string currlocline = currline;
if((currlocline.find('[') != -1) && (currlocline.find(']') != -1))
{
currlocline.erase(std::remove(currlocline.begin(), currlocline.end(), '['), currlocline.end());
currlocline.erase(std::remove(currlocline.begin(), currlocline.end(), ']'), currlocline.end());
size_t loc = currlocline.find(" ");
m_inpData.updateDate = currlocline.substr(0, loc);
m_inpData.updateTime = currlocline.substr(loc+1);
//GetTimeValues(currlocline.c_str());
}
else if(currlocline.find(SYMBOL_ROW) != -1)
{
size_t size = currlocline.find(":");
if(size != -1)
{
string currticker = currlocline.substr(size+1);
size = currticker.find("bk.HKd");
if(size != -1)
{
m_inpData.ticker = currticker.substr(0, size);
m_inpData.ticker.append(".HK");
}
else
m_inpData.ticker = currticker;
}
}
else if(currlocline.find(TOTAL_VOL) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.totalVolume = atol(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(BID_ROW) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.bidPrice = atof(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(BID_SIZE) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.bidsize = atoi(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ASK_ROW) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.askPrice = atof(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ASK_SIZE) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.asksize = atoi(currlocline.substr(size+1).c_str());
}
else if(currlocline.find(ROW80_3_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_3 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_4_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_4 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_5_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_5 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_6_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_6 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_7_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_7 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_8_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_8 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_9_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_9 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_10_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_10 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_11_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_11 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_12_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_12 = currlocline.substr(size+1).c_str();
}
else if(currlocline.find(ROW80_13_TEXT) != -1)
{
//update previous record info and store it into the map.
size_t size = currlocline.find(":");
m_inpData.row_13 = currlocline.substr(size+1).c_str();
}
return 0;
}
您好,我已经解决了这个问题,感谢您到目前为止的回复。
问题出在结构的 memset 上。由于这个 memset,每次我访问这个代码块时,它们都会创建内存。我正在删除该声明,它看起来不错