Отслеживание Valgrind 40 байтов в 1 блоке определенно теряется в записи потерь - PullRequest
0 голосов
/ 15 февраля 2012

Я новичок в Valgrind (и мой C / C ++ ржавый), и я получаю ошибку:

40 bytes in 1 blocks are definitely lost in loss record 35 of 111
==26930==    at 0x4C275C2: operator new(unsigned long) (vg_replace_malloc.c:261)
==26930==    by 0x5EFAFDB: cassie_init_with_timeout (cassie.cc:49)
==26930==    by 0x46E647: ngx_cassandra_upstream_get_peer (ngx_cassandra_upstream.c:274)
==26930==    by 0x41E00B: ngx_event_connect_peer (ngx_event_connect.c:25)

Я предполагаю, что char * last_error_string мне подходит, но как мне это сделать?отследить это?

Вот мой источник:

Создание объекта Cassie:

cassie_t cassie;

char *error = NULL;
cassie = new Cassie(host,port,error,CASSIE_ERROR_NONE);  /* this is line 49 in the above valgrind trace */
cassie->cassandra               = cassandra;

cassie_t является структурой объекта.

typedef struct Cassie *cassie_t;

У меня есть это, потому что я обертываю библиотеку C ++, чтобы вызвать ее из C.

Вот наш объект cassie_private.h

#include <string>
#include "libcassandra/cassandra.h"
#include "libcassie/cassie.h"

#ifdef __cplusplus
namespace libcassie {
    using namespace std;
    using namespace boost;
    class Cassie
    {
      // TODO do we need the host and the port??
      public:
            const char*     host;
        int             port;
        cassie_error_code_t last_error_code;
        char*           last_error_string; /* I am guessing my memory problem is here */
        tr1::shared_ptr<libcassandra::Cassandra>                    cassandra;

        Cassie();
        Cassie(const char *&host, int &port,char* &in_error_str, cassie_error_code_t error);
        ~Cassie();
    };
#else
    typedef
         struct Cassie
           Cassie; /* this is for in C */
#endif

}

#endif

Здесьis cassie_private.cc

#include "cassie_private.h"

namespace libcassie {

using namespace std;
using namespace libcassandra;

Cassie::Cassie() :
    host(),
    port(0),
    last_error_code(),
    last_error_string(NULL),
    cassandra()
{}

Cassie::Cassie(const char * &in_host, int &in_port, char* &in_error_str, cassie_error_code_t error) :
        host(in_host),
        port(in_port),
        last_error_code(error),
        last_error_string(in_error_str),
        cassandra()
{}

Cassie::~Cassie() {
    if(last_error_string) delete last_error_string;
}

}

Вызывается для удаления объекта в конце использования:

void cassie_free(cassie_t cassie) {

    if(!cassie) return;
    cassie->~Cassie();
    if(cassie) delete cassie;

}

Как отследить утечку памяти?

Заранее спасибо

1 Ответ

5 голосов
/ 15 февраля 2012

Сообщение Valgrind означает, что вы выделили немного памяти (в строке 49 файла cassie.cc), но вы теряете / перезаписываете указатель, даже не вызывая delete для него.

Вы должны отслеживать, гдеэто значение указателя отправляется (либо в отладчике, либо путем проверки), чтобы определить, где оно потеряно.Вы можете рассмотреть возможность установки точки наблюдения отладчика на указатель;это идентифицировало бы проблему в сценарии, где это перезаписывается.Если вы собираетесь сделать это в отладчике, убедитесь, что вы скомпилировали без включенной оптимизации.

...