c++ - 我必须在 linux 的 c++ 中释放 "string* settings = new string[4]"的内存吗?

标签 c++ linux pointers memory-leaks

我目前正在调试一些在 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/

相关文章:

python - shutil.rmtree() 会检查根目录吗?

c - 该特定代码是否存在内存泄漏?

javac 给出一条错误消息,它已找到

linux上的c++应用程序,在kill之前挂机

delphi - 在 64 位系统上使用小于 8 字节的指针有好处吗?

c - 数组中的模式出现

c++ - 检查 libpqxx (postgres) 中的连接是否仍处于事件状态

c++ - 专门用于指针的模板类

c++ - 使用 libxmlsec 从内存中加载 RSA 私钥

c++ - 是否允许枚举具有未列出的值?