Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
c++ÄÚ´æÐ¹Â©ÊµÕ½
 
×÷ÕߣºQ²©Ê¿
  2568  次浏览      27
 2020-7-7 
 
±à¼­ÍƼö:

±¾ÎÄÖ÷Òª½²½âÁ˼ì²â¹¤¾ßÒÔ¼°ÄÚ´æÐ¹Â©µãʵ¼ù£¬Ï£Íû±¾ÎĶԴó¼ÒÓаïÖú¡£

ÎÄÕÂÀ´×ÔÓÚ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

   
2568 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
.NET Core 3.0 Õýʽ¹«²¼£ºÐÂÌØÐÔÏêϸ½â¶Á
.NET Core²¿ÊðÖÐÄã²»Á˽âµÄ¿ò¼ÜÒÀÀµÓë¶ÀÁ¢²¿Êð
C# eventḬ̈߳²È«
¼òÎö .NET Core ¹¹³ÉÌåϵ
C#¼¼ÊõÂþ̸֮À¬»ø»ØÊÕ»úÖÆ(GC)
×îпγÌ
.NetÓ¦Óÿª·¢
C#¸ß¼¶¿ª·¢¼¼Êõ
.NET ¼Ü¹¹Éè¼ÆÓëµ÷ÊÔÓÅ»¯
ASP.NET Core Web ¿ª·¢
ASP.Net MVC¿ò¼ÜÔ­ÀíÓëÓ¦Óÿª·¢
³É¹¦°¸Àý
º½Ìì¿Æ¹¤¼¯ÍÅ×Ó¹«Ë¾ DotNetÆóÒµ¼¶Ó¦ÓÃÉè¼ÆÓ뿪·¢
ÈÕÕÕ¸Û¼¯ .NET Framewor
Éñ»ªÐÅ .NETµ¥Ôª²âÊÔ
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ