我有一个函数foo
,返回char*
。在函数体中,我声明char*
变量,使用malloc()
分配内存并返回它。
现在如果我尝试将函数foo用作条件语句(例如if (foo()) { //code } )
),分配的内存会发生什么变化?我无法理解的是,调用foo()
时没有将返回值赋给变量,是foo()
中分配的内存,内存泄漏?
我在调用foo()
但是没有将返回值赋给变量时能够执行该程序。但是我无法弄清楚在这种情况下是否真的分配了内存。
答案 0 :(得分:3)
评论简洁地回答了你的问题。
我无法理解的是,当foo被调用时,没有 将返回值赋给变量,是分配的内存 foo,内存泄漏?
确实是内存泄漏。你正在分配一些内存,然后忘记指向它的指针。
另一方面,如果您将返回值分配给变量,使用它,您稍后将释放内存。
答案 1 :(得分:0)
要注意的重要一点是,你在评论和其他答案中指出,你正在泄露记忆。
char* foo()
{
// Do things
char* info = malloc;
strcpy(info, "Hello");
return info;
}
int main()
{
if (foo())
{
std::cout << "Success" << std::endl;
}
}
对foo()
的调用有效,因为它不返回nullptr
条件为真;但是,您已经泄露了foo()
分配的内存,因为foo()
返回后您丢失了指针。
如果您愿意,可以将指针存储在相同的条件中:
if (char* f = foo())
{
std::cout << "Success" std::endl;
// Deallocate f
}
这将调用foo()
,将结果分配给f
并检查有效指针。
否则,您只需使用std::string
即可解决此问题(或者,如果您使用的不是char*
,则可以使用std::unique_ptr
):
std::string foo()
{
// Do things
std::string info = "Hello";
return info;
}
int main()
{
if (foo().length()) // does foo contain a valid string?
{
std::cout << "Success" << std::endl;
}
}
答案 2 :(得分:0)
与您看到的样本相同:
char * strcpy ( char * destination, const char * source );
你应该像这样设计你的函数来分配内存,你可以在任何地方使用它而不用担心内存泄漏。
这里有样品。例如你的代码:
char* yourfunc() {
char *str;
str = (char*)malloc(sizeof(char)*5);//only sample code
return str;
}
错误的代码,因为当你使用malloc时,你必须使用自由函数:free(str)。 改进代码:
char* yourfunc(char* yourdes) {
//do anything
return yourdes;
}
使用它:
char *abc;
abc = (char*)malloc(sizeof(char)*5); //init here
yourfunc(abc);
free(abc); // free here