【嵌入式人工智能产品开发实战】(二十四)—— 政安晨:解释一下小智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 析构函数的主要功能包括:
- 提交未保存的更改:如果设置了读写模式并且有未提交的更改(dirty_ 为 true),则调用
nvs_commit
提交更改 - 关闭 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 句柄被正确关闭。