此函数是否泄漏内存



下面的函数测试输入字符串是否包含双精度。

bool is_double(const std::string& str)
{
    char* p;
    strtod(str.c_str(), &p);
    return *p == 0;
}

函数返回后指针 p 会发生什么变化?

您需要考虑两个变量:strp

字符串str作为 const 引用传递,因此它的生存期必须在此函数的范围之外进行管理,因此此函数不会泄漏它。

使用字符指针 p ,我们可以考虑指针本身及其指向的内容。 根据文档,它设置为"...指向数字后面的第一个字符。 意思是,它指向你传递的字符串内的内存;它不会设置为新分配的内存。 由于您已经正确管理 str 的生命周期,并且没有分配任何新内容,因此您不必释放它所指向的内容。 指针变量本身是在堆栈上创建的,因此其生存期是函数的生存期。

所以,不,你没有泄漏。

当您分配的资源在特定范围之外变得无法访问,并且您没有释放它,也无法返回对它的引用时,无论该资源是动态内存、互斥锁还是任何其他进程绑定资源,都会发生资源泄漏。

在您的情况下,您正在创建一些变量并使用一个不执行任何动态内存分配的函数,因此您的所有内容都在堆栈中 => 没有内存泄漏,因为一旦您从函数返回,它就会"释放"。

由于指针在您的函数范围内,并且没有声明为任何全局内容,因此我相信它会在函数执行后自动删除。

指针 p 将由函数设置为数值之后的 str 中的下一个字符。

所以它不会泄漏内存

你也可以使用

bool is_double(const std::string& str)
{
   double d;
   d = strtod(str.c_str(), NULL);
   return d != 0.0;
}

最新更新