fix memleak

This commit is contained in:
lnk
2025-12-09 16:29:55 +08:00
parent b4ce0fa5f9
commit e615188bb1
2 changed files with 67 additions and 4 deletions

View File

@@ -418,7 +418,7 @@ void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
}
/* 数据写入回调 */
void on_write(uv_write_t* req, int status) {
/*void on_write(uv_write_t* req, int status) {
ClientContext* ctx = static_cast<ClientContext*>(req->handle->data);
if (status < 0) {
@@ -428,6 +428,23 @@ void on_write(uv_write_t* req, int status) {
std::cout << "on_write: " << ctx->device_info.mac << " down!" << std::endl;
delete[] static_cast<char*>(req->data); // 释放发送数据缓冲区
delete req; // 释放写入请求
}*/
//lnk20251209
void on_write(uv_write_t* req, int status) {
ClientContext* ctx = static_cast<ClientContext*>(req->handle->data);
if (status < 0) {
std::cerr << "[Device " << ctx->device_info.device_id
<< "] SEND ERROR: " << uv_strerror(status) << std::endl;
}
std::cout << "on_write: " << ctx->device_info.mac << " down!" << std::endl;
// 正确释放发送数据缓冲区
auto* data_vec = static_cast<std::vector<unsigned char>*>(req->data);
delete data_vec; // ✅ 与 new std::vector<unsigned char> 匹配
delete req; // ✅ 与 new uv_write_t 匹配
}
/* 定时发送回调 */
@@ -541,7 +558,7 @@ void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data
}
// 新增函数:在事件循环线程中安全发送数据
void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data) {
/*void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data) {
uv_work_t* req = new uv_work_t;
req->data = new std::pair<ClientContext*, std::vector<unsigned char>>(ctx, std::move(data));
@@ -570,7 +587,53 @@ void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data)
delete pair;
delete req;
});
}*/
//lnk20251209
void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data) {
uv_work_t* req = new uv_work_t;
req->data = new std::pair<ClientContext*, std::vector<unsigned char>>(ctx, std::move(data));
uv_queue_work(ctx->loop, req,
[](uv_work_t* ) { //req
// 在工作线程中不执行实际工作
},
[](uv_work_t* req, int status) {
auto* pair = static_cast<std::pair<ClientContext*, std::vector<unsigned char>>*>(req->data);
ClientContext* ctx = pair->first;
std::vector<unsigned char>& original_data = pair->second;
if (ctx->state == ConnectionState::CONNECTED) {
// 把数据复制到 write_req 自己持有的 vector 里
auto* send_buf = new std::vector<unsigned char>(original_data);
uv_buf_t buf = uv_buf_init(
reinterpret_cast<char*>(send_buf->data()),
send_buf->size()
);
uv_write_t* write_req = new uv_write_t;
write_req->data = send_buf; // on_write 里 delete
int ret = uv_write(write_req, (uv_stream_t*)&ctx->client, &buf, 1, on_write);
if (ret < 0) {
// 错误处理uv_write 没接管,自己负责释放
std::cerr << "[Device " << ctx->device_info.device_id
<< "] uv_write error: " << uv_strerror(ret) << std::endl;
delete send_buf;
delete write_req;
}
}
// 这里可以安全删除 pair发送使用的是 send_buf 那份拷贝
delete pair;
delete req;
}
);
}
/* 连接关闭回调 */
void on_close(uv_handle_t* handle) {
ClientContext* ctx = static_cast<ClientContext*>(handle->data);

View File

@@ -669,13 +669,13 @@ void Front::mqproducerThread()
extern thread_info_t thread_info[THREAD_CONNECTIONS];
void cleanup_args(ThreadArgs* args) {
/*void cleanup_args(ThreadArgs* args) {
for (int i = 0; i < args->argc; ++i) {
free(args->argv[i]); // strdup 分配的
}
delete[] args->argv;
delete args;
}
}*/
void* cloudfrontthread(void* arg) {