±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½²½âÁ˼ì²â¹¤¾ßÒÔ¼°ÄÚ´æÐ¹Â©µãʵ¼ù£¬Ï£Íû±¾ÎĶԴó¼ÒÓаïÖú¡£
ÎÄÕÂÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûAnna±à¼ÍƼö¡£ |
|
¼ì²â¹¤¾ß
ÎÒÒ»°ã»áÓÃÒÔÏÂÃüÁîÆô¶¯³ÌÐò£¬È»ºó°Ñ¸÷¸ö½Ó¿Ú´¥·¢Ò»±é£¬ÈôúÂ븲¸ÇµÄȫһµã£¬È»ºóctrl+c½áÊø³ÌÐò£¬´ò¿ªleak.logÎļþ²é¿´ÄÚ´æÐ¹Â©Çé¿ö¡£
valgrind --tool=memcheck
--leak-check=full --show-reachable=yes --log-file=leak.log
<binÎļþ> |
´ò¿ªleak.logÎļþºó£¬»áÖ±½ÓÌøµ½×îºó¿´LEAK SUMMARY:

ÉÏͼÖÐdefinitely lostÒ»À¸±íʾÓÐÒ»¸öй©µã£¬Ð¹Â©ÁË56bytesÄڴ档ĿǰÎÒÃÇÖ»¹Ø×¢definitely
lostй©£¬Èç¹ûÐÞ¸´ºó£¬LEAK SUMMARYÓ¦¸ÃÈçÏÂËùʾ:

Èç¹û·¢ÏÖdefinitely lostÓÐй©µã£¬ÎÒ»áÓÃdefinitely lost¹Ø¼ü×ÖÈ¥ËÑË÷¾ßÌåй©µã£¬Õâ¸öµØ·½ÐèÒªÌáÐÑÏ£¬¾¡Á¿°ÑÄãÒÀÀµµÄ¾²Ì¬¿âÖж¼¼ÓÉÏ-g²ÎÊý£¬²»È»ÎÞ·¨ÏÔʾ¾²Ì¬¿âй©µãµÄÐкţ¬¶Ô²éÎÊÌâ²»·½±ã¡£
ÄÚ´æÐ¹Â©µãʵ¼ù
´ÓÎÒ×î½üÐ޵öÄÚ´æÐ¹Â©µãÏêϸ½²½âÏ¡£
0x01
ÅжÏÌõ¼þÔÚijÖÖÌõ¼þʧЧ
redisReply *reply
= NULL;
int redis_ret;
for (int i = 0; i < valid_cmd_num; ++i) {
redis_ret = redisGetReply(conn->_ctx, (void
**) &reply);
if (REDIS_OK != redis_ret) {
DS_LOG_WARNING("execute cmd by pipeline failed.
errno:[%d], err_msg:[%s] cmd:[%s]", conn->_ctx->err,
conn->_ctx->errstr, cmds[cmd_index[i]].c_str());
break;
}
std::vector <std::string> rider_info;
if (NULL != reply && REDIS_REPLY_ARRAY
== reply->type) {
for (int j = 0; j < reply->elements; ++j)
{
if (REDIS_REPLY_STRING != reply->element[j]->type)
{
rider_info.push_back("");
} else {
rider_info.push_back(reply->element[j]->str);
}
}
if (!rider_info.empty()) {
value.push_back(rider_info);
}
freeReplyObject(reply);
reply = NULL;
}
}
if (NULL != reply) {
freeReplyObject(reply);
}
|
Õâ¸ö·½·¨ÊÇredisÖ´ÐÐpipeline·½·¨£¬ÎÒ°Ñget/set·½·¨ôۺϵ½Ò»ÆðÁË£¬¹Ø×¢ÄÚ´æÐ¹Â©µãµÄʱºòÖ»¿¼ÂÇÁËgetÇé¿ö£¬Ö»ÓÐgetÓзµ»Ø£¬ÇÒ·µ»Ø¶ÔÏóÊÇarray²Å»áµ÷ÓÃÈçÏ·½·¨ÊÍ·ÅreplyÖ¸Õ룬µ«ÎÒºöÂÔÁËsetÇé¿öÏÂreply->type²»ÊÇarray£¬ËùÒÔÒ²¾Í×ß²»µ½ÏÂÃæµÄ·½·¨£¬forÑ»·¹ý³ÌÖвúÉúµÄreplyÖ¸Õë¶¼ÎÞ·¨ÊÍ·Å£¬×îºóforÑ»·ÍâµÄÊÍ·ÅreplyÖ»ÄܲÙ×÷×îºóÒ»¸öreplyÖ¸Õ룬Õâ¾ÍÔì³ÉÁËÄÚ´æÐ¹Â©ÁË¡£
freeReplyObject(reply);
reply = NULL; |
½â¾ö·½·¨
forÑ»·ÖÐÖ»Òªreply!=NULL¶¼ÒªÊÍ·ÅÖ¸Õ룬µ÷ÕûºóµÄ´úÂëÈçÏ£º
redisReply *reply
= NULL;
int redis_ret;
for (int i = 0; i < valid_cmd_num; ++i) {
redis_ret = redisGetReply(conn->_ctx, (void
**) &reply);
if (REDIS_OK != redis_ret) {
DS_LOG_WARNING("execute cmd by pipeline failed.
errno:[%d], err_msg:[%s] cmd:[%s]", conn->_ctx->err,
conn->_ctx->errstr, cmds[cmd_index[i]].c_str());
break;
}
std::vector <std::string> rider_info;
if (NULL != reply) {
if(REDIS_REPLY_ARRAY == reply->type) {
for (int j = 0; j < reply->elements; ++j)
{
if (REDIS_REPLY_STRING != reply->element[j]->type)
{
rider_info.push_back("");
} else {
rider_info.push_back (reply->element[j]->str);
}
}
if (!rider_info.empty()) {
value.push_back(rider_info);
}
}
freeReplyObject(reply);
reply = NULL;
DS_LOG_DEBUG("test[%d]",0);
}
}
if (NULL != reply) {
freeReplyObject(reply);
DS_LOG_DEBUG("test[%d]",1);
reply = NULL;
}
|
0x02
Ö¸Õë³õʼ»¯Î»Öò»µ±
int A::b(FileInfo
*file) {
if (NULL == file) {
DS_LOG_WARNING("fileinfo is NULL");
return -1;
}
//ÑÓ³Ù5s¼ÓÔØ
uint64_t start = CommonUtil::get_ms_timestamp();
AvgConf *new_avg_data = new AvgConf();
//load file
std::string file_path = file->_file_path +
file->_file_name;
std::ifstream in_file(file_path.c_str());
if (!in_file) {
DS_LOG_WARNING("open file [%s] failed",
file_path.c_str());
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find(file->_file_path);
if (iter != _avg_info_map.end()) {
_avg_info_map.erase(file->_file_path);
}
file->_last_modify_time = file->file_time();
return -1;
}
if (!file->is_channged()) {
return 0;
}
//¸ønew_avg_dataÉèÖÃÖµµÃ¹ý³Ì
....
file->_last_modify_time = file->file_time();
in_file.clear();
in_file.close();
if (0 == data_count) {
DS_LOG_WARNING("new avg_data is empty");
delete new_avg_data;
new_avg_data = NULL;
return 0;
}
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find(file->_file_path);
if (iter != _avg_info_map.end()) {
//Ö¸ÕëÇл»£¬ÐèÒªÊÍ·Å֮ǰµÄÖ¸Õë
AvgConf *tmp = iter->second;
iter->second = new_avg_data;
if (NULL != tmp) {
//ÑÓ³Ù20sɾ³ý
sleep(20);
delete tmp;
tmp = NULL;
}
} else {
DS_LOG_DEBUG("avg_key: [%s]", file->_file_path.c_str());
_avg_info_map.insert(std::make_pair(file->_file_path,
new_avg_data));
}
return 0;
}
|
ÕâÊÇÒ»¸öÔÚÏß³ÌÖÐÿ¸ôÒ»¶Îʱ¼ä¶¼»áµ÷Óõķ½·¨£¬Óõ½ÅжÏÎļþÊÇ·ñÓиüУ¬Èç¹ûÓиüоÍÒª¸üÐÂÄÚ´æÖеÄÊý¾Ý£¬Ã»ÓиüоÍÖ±½Ó·µ»ØÁË¡£µÚÒ»´Îµ÷Óø÷½·¨Ê±£¬ÊÇûÓÐÎÊÌâµÄ£¬µ«ÊÇ·¢ÏÖÈçÏÂÖ¸ÕëÊÇÔÚÅжÏǰ¾Í³õʼ»¯ÁË£º
AvgConf *new_avg_data
= new AvgConf(); |
Èç¹ûµÚÒ»´Î¹ýºóÔÙµ÷Óø÷½·¨£¬Èç¹ûÎļþûÓиüУ¬×ßµ½ÅжÏÎļþÊÇ·ñ±ä»¯µÄ·½·¨£¬¾Í»áÖ±½Óreturn -1,Õâ¸öʱºòÕâ¸öÖ¸Õë¾ÍÔÚÄÄÀïã±ÆÁË£¬Ã»È˹ÜËûÁË¡£
½â¾ö·½·¨
°ÑÖ¸Õë³õʼ»¯µÄ¹ý³Ì·Åµ½file->is_channged()ÅжϺóÃæ£¬Ð޸ĺóÈçÏ£º
int A::b(FileInfo
*file) {
if (NULL == file) {
DS_LOG_WARNING("fileinfo is NULL");
return -1;
}
//ÑÓ³Ù5s¼ÓÔØ
uint64_t start = CommonUtil::get_ms_timestamp();
//load file
std::string file_path = file->_file_path +
file->_file_name;
std::ifstream in_file (file_path.c_str());
if (!in_file) {
DS_LOG_WARNING("open file [%s] failed",
file_path.c_str());
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find (file->_file_path);
if (iter != _avg_info_map.end()) {
_avg_info_map.erase (file->_file_path);
}
file->_last_modify_time = file->file_time();
return -1;
}
if (!file->is_channged()) {
return 0;
}
AvgConf *new_avg_data = new AvgConf();
//¸ønew_avg_dataÉèÖÃÖµµÃ¹ý³Ì
....
file->_last_modify_time = file->file_time();
in_file.clear();
in_file.close();
if (0 == data_count) {
DS_LOG_WARNING ("new avg_data is empty");
delete new_avg_data;
new_avg_data = NULL;
return 0;
}
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find(file->_file_path);
if (iter != _avg_info_map.end()) {
//Ö¸ÕëÇл»£¬ÐèÒªÊÍ·Å֮ǰµÄÖ¸Õë
AvgConf *tmp = iter->second;
iter->second = new_avg_data;
if (NULL != tmp) {
//ÑÓ³Ù20sɾ³ý
sleep(20);
delete tmp;
tmp = NULL;
}
} else {
DS_LOG_DEBUG("avg_key: [%s]", file->_file_path.c_str());
_avg_info_map.insert(std::make_pair (file->_file_path,
new_avg_data));
}
return 0;
}
|
0x03
Ö¸Õë½»»»£¬ÔÖ¸ÕëûÓд¦Àí
int A::b(FileInfo
*file) {
if (NULL == file) {
DS_LOG_WARNING("fileinfo is NULL");
return -1;
}
//ÑÓ³Ù5s¼ÓÔØ
uint64_t start = CommonUtil::get_ms_timestamp();
//load file
std::string file_path = file->_file_path +
file->_file_name;
std::ifstream in_file(file_path.c_str());
if (!in_file) {
DS_LOG_WARNING ("open file [%s] failed",
file_path.c_str());
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find (file->_file_path);
if (iter != _avg_info_map.end()) {
_avg_info_map.erase (file->_file_path);
}
file->_last_modify_time = file->file_time();
return -1;
}
if (!file->is_channged()) {
return 0;
}
AvgConf *new_avg_data = new AvgConf();
//¸ønew_avg_dataÉèÖÃÖµµÃ¹ý³Ì
....
file->_last_modify_time = file->file_time();
in_file.clear();
in_file.close();
if (0 == data_count) {
DS_LOG_WARNING ("new avg_data is empty");
delete new_avg_data;
new_avg_data = NULL;
return 0;
}
std::map<std::string, AvgConf *>::iterator
iter = _avg_info_map.find (file->_file_path);
if (iter != _avg_info_map.end()) {
iter->second = new_avg_data;
} else {
DS_LOG_DEBUG("avg_key: [%s]", file->_file_path.c_str());
_avg_info_map.insert(std:: make_pair(file->_file_path,
new_avg_data));
}
return 0;
}
|
ÉÏÃæµÄÎÊÌâÊÇÔÚÌæ»»ÄÚ´æÖÐÊý¾Ýʱiter->second = new_avg_data;£¬ÔÏȵÄÖ¸ÕëûÓÐ×öÊÍ·ÅÖ¸ÕëµÄ²Ù×÷£¬È»ºóvalgrind»á¼ì²éµ½AvgConf
*new_avg_data = new AvgConf();Óï¾äûÓÐÊÍ·ÅÄÚ´æ¡£
½â¾ö·½·¨
½»»»Ö¸Õ룬ÓÃÁÙʱָÕë´æ·Å¾ÉÖ¸Õ룬ȻºóÊÍ·Å¡£
AvgConf *tmp
= iter->second;
iter->second = new_avg_data;
if (NULL != tmp) {
//ÑÓ³Ù20sɾ³ý
sleep(20);
delete tmp;
tmp = NULL;
}
1 |
|