下面的函数测试输入字符串是否包含double。
bool is_double(const std::string& str)
{
char* p;
strtod(str.c_str(), &p);
return *p == 0;
}
函数返回后指针p会发生什么?
答案 0 :(得分:6)
您需要考虑两个变量:str
和p
。
字符串str
作为const引用传递,因此它的生命周期必须在此函数范围之外进行管理,因此不能被此函数泄露。
使用字符指针p
,我们可以考虑指针本身及其指向的内容。根据文档,它被设置为“...指向数字后面的第一个字符。”意思是,它指向你传递的字符串中的内存;它没有设置为新分配的内存。由于您已经正确地管理了str的生命周期,并且没有分配任何新内容,因此您不必释放它所指向的内容。指针变量本身是在堆栈上创建的,因此它的生命周期是函数的生命周期。
所以,不,你没有泄漏。
答案 1 :(得分:1)
当您分配在某个范围之外无法访问的资源并且您没有释放它也无法获取对它的引用时发生资源泄漏,无论该资源是动态内存,互斥还是任何其他进程资源。
在你的情况下,你创建了一些变量并使用了一个没有做任何动态内存分配的函数,所以你所有的东西都在堆栈中=> 没有内存泄漏,因为它已经被释放了#34;一旦你从函数返回。
答案 2 :(得分:0)
由于指针在函数范围内并且未被声明为全局,我相信它将在执行函数后自动擦除。
答案 3 :(得分:0)
指针p将由函数设置为数值后的str中的下一个字符。
所以它不会泄漏内存
你也可以使用
bool is_double(const std::string& str)
{
double d;
d = strtod(str.c_str(), NULL);
return d != 0.0;
}