<p>hiredis اختبار تسرب الذاكرة بواسطة valgrind</p>

تم إنشاؤها على ١٩ سبتمبر ٢٠١٧  ·  6تعليقات  ·  مصدر: redis/hiredis

مرحبًا ، أنا أستخدم مكتبة hiredis في خدمة C ++ الخاصة بي ، ولكن حدث تسرب للذاكرة. ناتج فالجرينج مثل هذا:
== 11465 == 867 (816 مباشر ، 51 غير مباشر) بايت في 17 كتلة ضاعت بالتأكيد في سجل الخسارة 127 من 158
== 11465 == في 0x4C27F6F: calloc (vg_replace_malloc.c: 623)
== 11465 == بواسطة 0x5C8DF67: createReplyObject (hiredis.c: 64)
== 11465 == بواسطة 0x5C8DF67: createStringObject (hiredis.c: 106)
== 11465 == بواسطة 0x5C9550C: processLineItem (read.c: 230)
== 11465 == بواسطة 0x5C9550C: processItem (read.c: 405)
== 11465 == بواسطة 0x5C9550C: redisReaderGetReply (read.c: 503)
== 11465 == بواسطة 0x5C8E173: redisGetReplyFromReader (hiredis.c: 863)
== 11465 == بواسطة 0x5C8ECEA: redisGetReply (hiredis.c: 890)
== 11465 == بواسطة 0x5C8FEA4: __redisBlockForReply (hiredis.c: 995)
== 11465 == بواسطة 0x5C8FEA4: redisvCommand (hiredis.c: 1005)
== 11465 == بواسطة 0x5C8FF37: redisCommand (hiredis.c: 1011)

التعليق الأكثر فائدة

في هذا الكود:
باطل Redis :: selectdb (int db)
{
redisCommand (_connect، "SELECT٪ d"، db) ؛
}

قيمة إرجاع redisCommand ليست مجانية ؛

النهج الصحيح:

رد * رد ؛
رد = redisCommand (_connect، "SELECT٪ d"، db) ؛
إذا (رد)
{
freeReplyObject (رد) ؛
}

2017-09-19 10:58 GMT + 08:00 مباراة في [email protected] :

مرحبًا ، أنا أستخدم مكتبة hiredis في خدمة C ++ الخاصة بي ، ولكن حدث ذلك
تسريب ذاكرة. ناتج فالجرينج مثل هذا:
== 11465 == 867 (816 مباشر ، 51 غير مباشر) بايت في 17 كتلة هي بالتأكيد
خسر في سجل الخسارة 127 من 158
== 11465 == في 0x4C27F6F: calloc (vg_replace_malloc.c: 623)
== 11465 == بواسطة 0x5C8DF67: createReplyObject (hiredis.c: 64)
== 11465 == بواسطة 0x5C8DF67: createStringObject (hiredis.c: 106)
== 11465 == بواسطة 0x5C9550C: processLineItem (read.c: 230)
== 11465 == بواسطة 0x5C9550C: processItem (read.c: 405)
== 11465 == بواسطة 0x5C9550C: redisReaderGetReply (read.c: 503)
== 11465 == بواسطة 0x5C8E173: redisGetReplyFromReader (hiredis.c: 863)
== 11465 == بواسطة 0x5C8ECEA: redisGetReply (hiredis.c: 890)
== 11465 == بواسطة 0x5C8FEA4: __redisBlockForReply (hiredis.c: 995)
== 11465 == بواسطة 0x5C8FEA4: redisvCommand (hiredis.c: 1005)
== 11465 == بواسطة 0x5C8FF37: redisCommand (hiredis.c: 1011)

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/redis/hiredis/issues/546 ، أو كتم صوت الموضوع
https://github.com/notifications/unsubscribe-auth/AFz9paGGNFCWQQYtW7bRlQlL-EHINXh6ks5sjy3ggaJpZM4PbyeT
.

ال 6 كومينتر

هل يمكنك تقديم نص صغير يسبب المشكلة؟ لا توجد طريقة لمعرفة ما إذا كان هذا المكدس يُظهر تسريبًا في hiredis أو في كيفية الاتصال به.

هل أنت متأكد من أنك تتصل بـ freeReplyObject في كل مرة تتلقى فيها ردًا؟

مثله:
== 11465 == 1،020 (960 مباشر ، 60 غير مباشر) بايت في 20 كتلة ضاعت بالتأكيد في سجل الخسارة 128 من 158
== 11465 == في 0x4C27F6F: calloc (vg_replace_malloc.c: 623)
== 11465 == بواسطة 0x5C8DF67: createReplyObject (hiredis.c: 64)
== 11465 == بواسطة 0x5C8DF67: createStringObject (hiredis.c: 106)
== 11465 == بواسطة 0x5C9550C: processLineItem (read.c: 230)
== 11465 == بواسطة 0x5C9550C: processItem (read.c: 405)
== 11465 == بواسطة 0x5C9550C: redisReaderGetReply (read.c: 503)
== 11465 == بواسطة 0x5C8E173: redisGetReplyFromReader (hiredis.c: 863)
== 11465 == بواسطة 0x5C8ECEA: redisGetReply (hiredis.c: 890)
== 11465 == بواسطة 0x5C8FEA4: __redisBlockForReply (hiredis.c: 995)
== 11465 == بواسطة 0x5C8FEA4: redisvCommand (hiredis.c: 1005)
== 11465 == بواسطة 0x5C8FF37: redisCommand (hiredis.c: 1011)
== 11465 == بواسطة 0x477A64: Redis :: selectdb (int) (redis.cpp: 100)
== 11465 == بواسطة 0x4781C3: Redis :: hset_get (int ، std :: string const & ، std :: string const &) (redis.cpp: 224)

وفي redis.cpp الخاص بي:

باطل Redis :: selectdb (int db)
{
redisCommand (_connect، "SELECT٪ d"، db) ؛
}

سلسلة Redis :: hset_get (int db ، سلسلة ومفتاح const ، سلسلة وحقل const)
{
std :: string str = ""؛
selectdb (ديسيبل) ؛
_reply = (redisReply *) redisCommand (_connect، "HGET٪ s٪ s"، key.c_str ()، field.c_str ()) ؛
إذا (_ رد-> لين> 0)
{
str = _reply-> str ؛
}
freeReplyObject (_reply) ،
شارع العودة
}

هل يحتاج select db أيضًا إلى freeReplyObject؟

فهمت ، شكرا

في هذا الكود:
باطل Redis :: selectdb (int db)
{
redisCommand (_connect، "SELECT٪ d"، db) ؛
}

قيمة إرجاع redisCommand ليست مجانية ؛

النهج الصحيح:

رد * رد ؛
رد = redisCommand (_connect، "SELECT٪ d"، db) ؛
إذا (رد)
{
freeReplyObject (رد) ؛
}

2017-09-19 10:58 GMT + 08:00 مباراة في [email protected] :

مرحبًا ، أنا أستخدم مكتبة hiredis في خدمة C ++ الخاصة بي ، ولكن حدث ذلك
تسريب ذاكرة. ناتج فالجرينج مثل هذا:
== 11465 == 867 (816 مباشر ، 51 غير مباشر) بايت في 17 كتلة هي بالتأكيد
خسر في سجل الخسارة 127 من 158
== 11465 == في 0x4C27F6F: calloc (vg_replace_malloc.c: 623)
== 11465 == بواسطة 0x5C8DF67: createReplyObject (hiredis.c: 64)
== 11465 == بواسطة 0x5C8DF67: createStringObject (hiredis.c: 106)
== 11465 == بواسطة 0x5C9550C: processLineItem (read.c: 230)
== 11465 == بواسطة 0x5C9550C: processItem (read.c: 405)
== 11465 == بواسطة 0x5C9550C: redisReaderGetReply (read.c: 503)
== 11465 == بواسطة 0x5C8E173: redisGetReplyFromReader (hiredis.c: 863)
== 11465 == بواسطة 0x5C8ECEA: redisGetReply (hiredis.c: 890)
== 11465 == بواسطة 0x5C8FEA4: __redisBlockForReply (hiredis.c: 995)
== 11465 == بواسطة 0x5C8FEA4: redisvCommand (hiredis.c: 1005)
== 11465 == بواسطة 0x5C8FF37: redisCommand (hiredis.c: 1011)

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/redis/hiredis/issues/546 ، أو كتم صوت الموضوع
https://github.com/notifications/unsubscribe-auth/AFz9paGGNFCWQQYtW7bRlQlL-EHINXh6ks5sjy3ggaJpZM4PbyeT
.

حسن

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات