下面的函数测试输入字符串是否包含双精度。
bool is_double(const std::string& str)
{
char* p;
strtod(str.c_str(), &p);
return *p == 0;
}
函数返回后指针 p 会发生什么变化?
您需要考虑两个变量:str
和 p
。
字符串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;
}