gpt4 book ai didi

c++ - Tracking down Valgrind 40 bytes in 1 blocks 肯定丢在丢失记录中

转载 作者:太空宇宙 更新时间:2023-11-04 16:28:50 26 4
gpt4 key购买 nike

我是 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

这里是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;

}

我如何跟踪此内存泄漏?

最佳答案

Valgrind 消息意味着您已经分配了一些内存(在 cassie.cc 的第 49 行),但是您正在丢失/覆盖指针,而无需对其调用 delete

您应该跟踪该指针值的去向(在调试器中或通过检查),以便发现它丢失的位置。您可能会考虑在指针上放置一个调试器观察点;这将确定它被覆盖的场景中的问题。如果您要在调试器中执行此操作,请确保您已在未启用优化的情况下进行编译。

关于c++ - Tracking down Valgrind 40 bytes in 1 blocks 肯定丢在丢失记录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com