mysql_store_result

在 MySQL C API 中,关闭 `mysql_store_result` 申请的结果集使用:

正确的释放函数:

```c

mysql_free_result(MYSQL_RES *result);

```

在你的代码中的使用:

```cpp

// 申请结果集

MYSQL_RES* res = mysql_store_result(sql);

// 使用结果集...

// 释放结果集

mysql_free_result(res);

res = nullptr; // 可选:设置为nullptr避免野指针

```

完整的正确代码示例:

```cpp

#include <iostream>

#include <string>

#include <cstring>

#include <mysql/mysql.h>

const std::string host = "localhost";

const std::string user = "connector";

const std::string passwd = "123456";

const std::string db = "conn";

unsigned int port = 3306;

int main(){

MYSQL * sql = mysql_init(nullptr);

if(sql == nullptr)

{

std::cerr << "mysql初始化失败" << std::endl;

return 1;

}

mysql_set_character_set(sql, "utf8");

if(!mysql_real_connect(sql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0))

{

std::cerr << "mysql连接失败" << std::endl;

return 2;

}

std::string onemysql;

MYSQL_RES* res = nullptr; // 初始化为nullptr

while(true)

{

std::cout << "MySQL<<<";

if(!std::getline(std::cin, onemysql) || onemysql == "quit")

{

break;

}

int ret = mysql_query(sql, onemysql.c_str());

if(ret == 0)

{

std::cout << onemysql << " success: " << ret << std::endl;

// 获取结果集

res = mysql_store_result(sql);

if(res != nullptr)

{

// 处理结果集...

uint64_t row_count = mysql_num_rows(res);

uint64_t field_count = mysql_num_fields(res);

// 提取字段信息

MYSQL_FIELD* fields = mysql_fetch_fields(res);

for(uint64_t i = 0; i < field_count; i++)

{

std::cout << fieldsi.name << "\t";

}

std::cout << std::endl;

// 提取行数据

MYSQL_ROW row;

while((row = mysql_fetch_row(res)))

{

for(uint64_t j = 0; j < field_count; j++)

{

std::cout << (rowj ? rowj : "NULL") << "\t";

}

std::cout << std::endl;

}

// ✅ 正确释放结果集

mysql_free_result(res);

res = nullptr; // 避免野指针

}

else

{

// 对于非SELECT查询,mysql_store_result返回nullptr是正常的

if(mysql_field_count(sql) == 0)

{

std::cout << "影响的行数: " << mysql_affected_rows(sql) << std::endl;

}

else

{

std::cerr << "mysql_store_result error: " << mysql_error(sql) << std::endl;

}

}

}

else

{

std::cout << onemysql << " failed: " << mysql_error(sql) << std::endl;

}

}

// 最后清理

if(res != nullptr)

{

mysql_free_result(res); // 确保释放

}

mysql_close(sql);

return 0;

}

```

重要注意事项:

  1. **每次调用 `mysql_store_result` 后都必须调用 `mysql_free_result`**

  2. **在循环中要及时释放**,避免内存泄漏

  3. **设置为 `nullptr`** 可以避免重复释放

  4. **对于非SELECT语句**,`mysql_store_result` 返回 `nullptr` 是正常的

内存管理对比:

| 函数 | 用途 | 需要释放 |

|------|------|----------|

| `mysql_store_result()` | 获取整个结果集 | 是,用 `mysql_free_result()` |

| `mysql_use_result()` | 逐行获取结果集 | 是,用 `mysql_free_result()` |

| `mysql_fetch_row()` | 获取一行数据 | 自动管理 |

| `mysql_fetch_fields()` | 获取字段信息 | 自动管理 |

记住:**有 `mysql_store_result` 就必须有对应的 `mysql_free_result`**!

相关推荐
Xzaveir24 分钟前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_9160074733 分钟前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴1 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭1 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
HLC++14 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼18 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼18 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon19 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138421 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记21 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求