我目前正在调试一些在 linux 操作系统 (centos 5) 中运行的遗留 c++ 程序。这些程序都调用类静态成员函数来获取数据库连接设置。这个类是这样编码的
class DbSetting {
public:
static string* getDbSettings();
};
string* DbSetting::getDbSettings() {
string* settings = new string[4];
settings[0] = "dbname";
settings[1] = "server";
settings[2] = "username";
settings[3] = "password";
return settings;
}
在每个程序的main()函数中,都会这样调用这个静态函数,
int main(int argc, char* argv[]) {
string* dbSettings = DbSetting::getDbSettings();
//dbSettings is used to construct a db connection string
return 0;
}
dbSettings 用于构造数据库连接字符串。但是,它并没有被“删除”(例如“delete[] dbSettings”)。我的问题是这是潜在的内存泄漏问题吗?这种用法也存在于许多其他遗留的 c++ 程序中。我对此感到困惑。希望有人能给我一个答案。谢谢你!
最佳答案
确实是内存泄漏。这是一个有点小的问题,因为无论如何你的数据都需要在程序结束时保持事件状态,并且在程序终止时它会被清理 - 但它会导致内存泄漏检测器出现误报,所以这通常是个好主意无论如何都要正确清理;如果你让自己依赖操作系统清理,当你真的需要诊断内存泄漏时,你会发现你有数百个误报需要整理!将代码重构为可能在同一进程中多次启动和停止的更大系统的一部分也非常困难。
避免这种情况的最简单方法是使用 vector
:
std::vector<string> DbSetting::getDbSettings() {
std::vector<string> settings(4);
settings[0] = "dbname";
settings[1] = "server";
settings[2] = "username";
settings[3] = "password";
return settings;
}
int main(int argc, char* argv[]) {
std::vector<string> dbSettings = DbSetting::getDbSettings();
//dbSettings is used to construct a db connection string
return 0;
}
vector
从main返回时销毁它时会自动清理里面的字符串数组占用的内存。它还具有许多原始数组所没有的非常方便的功能 - 例如,它会跟踪数组大小,并且可以在您使用 push_back
添加新元素时自动调整数组大小。
关于c++ - 我必须在 linux 的 c++ 中释放 "string* settings = new string[4]"的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656687/