当前位置: 首页 > news >正文

【嵌入式人工智能产品开发实战】(二十四)—— 政安晨:解释一下小智AI项目中析构函数的应用

政安晨的个人主页:政安晨

欢迎 👍点赞✍评论⭐收藏

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

小智AI的项目是基于面向对象思想开发的,使用C++语言,习惯C语言开发嵌入式的小伙伴有时不适应,析构函数的使用就是其中之一。

小智AI的Setting文件:

#ifndef SETTINGS_H
#define SETTINGS_H#include <string>
#include <nvs_flash.h>class Settings {
public:Settings(const std::string& ns, bool read_write = false);~Settings();std::string GetString(const std::string& key, const std::string& default_value = "");void SetString(const std::string& key, const std::string& value);int32_t GetInt(const std::string& key, int32_t default_value = 0);void SetInt(const std::string& key, int32_t value);bool GetBool(const std::string& key, bool default_value = false);void SetBool(const std::string& key, bool value);void EraseKey(const std::string& key);void EraseAll();private:std::string ns_;nvs_handle_t nvs_handle_ = 0;bool read_write_ = false;bool dirty_ = false;
};#endif

其中, ~Settings(); 这个方法好像没有地方调用? 但这个函数里面的功能又是很重要,怎么回事?

其实,

~Settings() 是 Settings 类的析构函数,在对象生命周期结束时被调用。根据项目代码分析,这个析构函数会在以下情况下生效:

析构函数的作用

Settings 析构函数的主要功能包括:

  1. 提交未保存的更改:如果设置了读写模式并且有未提交的更改(dirty_ 为 true),则调用 nvs_commit 提交更改
  2. 关闭 NVS 句柄:调用 nvs_close 关闭之前打开的 NVS 命名空间句柄

生效时机

根据项目中的使用情况,~Settings() 析构函数会在以下场景中被调用:

1. 局部对象使用完毕后

当在函数中创建 Settings 对象作为局部变量时,对象在作用域结束时会自动调用析构函数:

// 示例:在函数中使用 Settings 对象
void someFunction() {Settings settings("wifi", true);settings.SetString("ota_url", "http://example.com/firmware");// 函数结束时,settings 对象的析构函数会被自动调用
}

2. 成员变量析构时

当包含 Settings 对象作为成员变量的类实例被销毁时:

class SomeClass {
private:Settings settings_;
public:SomeClass() : settings_("wifi", true) {}// 当 SomeClass 实例被销毁时,settings_ 的析构函数也会被调用
};

3. 动态分配对象被删除时

如果通过 new 创建了 Settings 对象,当使用 delete 删除时会调用析构函数:

Settings* settings = new Settings("wifi", true);
// ... 使用 settings
delete settings; // 此时调用析构函数

实际项目中的使用示例

在项目中,Settings 对象通常作为局部变量使用,例如在 Ota::GetCheckVersionUrl() 函数中:

std::string Ota::GetCheckVersionUrl() {Settings settings("wifi", false);  // 创建局部 Settings 对象std::string url = settings.GetString("ota_url");if (url.empty()) {url = CONFIG_OTA_URL;}return url;// 函数结束时,settings 对象的析构函数自动被调用
}

在这种情况下,当函数执行完毕时,Settings 对象的析构函数会被自动调用,确保任何未提交的更改被保存,并且 NVS 句柄被正确关闭。


http://www.dtcms.com/a/337800.html

相关文章:

  • McCabe 环形复杂度
  • Owen大规模文本嵌入生成
  • PMP-项目管理-十大知识领域:风险管理-识别、评估、应对项目风险
  • nsfp-
  • 《Image Classification with Classic and Deep Learning Techniques》复现
  • 地图导航怎么测?
  • 深入浅出决策树
  • 决策树总结
  • 视觉语言导航(9)——位置编码 VLNBERT与HAMT 记忆模块 3.3后半段
  • 如何简单实现排行榜功能
  • 【数模国奖冲刺】备赛过程中的常见问题
  • Tomcat Engine 原理深度解析
  • python的电影院座位管理可视化数据分析系统
  • 宋红康 JVM 笔记 Day05|运行时数据区内部结构、JVM中的线程说明、程序计数器
  • linux系统查看ip命令
  • 【自动化测试】Selenium详解-WebUI自动化测试
  • 【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
  • 《清华级防护,了解一下?》
  • 局域网视频软件BeeWorks,内网顺畅沟通
  • FPGA学习笔记——IIC协议简介
  • ​​​​​​​专精特新企业数据(附参考文献, 2013-2023)
  • [openvela] Hello World :从零开始的完整实践与问题复盘
  • linux-高级IO(中)
  • Python数据容器(列表,元组,字典) 从入门到精通
  • 基于Python的就业信息推荐系统 Python+Django+Vue.js
  • 封装,继承,多态
  • 【CV 目标检测】Fast RCNN模型③——模型训练/预测
  • day44_2025-08-18
  • iOS 性能监控全流程实践,从开发到上线的多工具组合方案
  • RabbitMQ ,消息进入死信交换机