这是内存泄漏,因为内存分配在堆栈上?
我有一个设备可以是“路由器”或“开关”。 我使用下面的函数,传递给它一个返回字符串的枚举。 我的问题是,whoami的内存分配在堆栈上。 当这个函数devicetype_string完成时,堆栈被销毁。 当我使用指向堆栈上分配的内存的指针时,这不会引起问题吗?
当前的代码有效。 我只是想明白它为什么起作用。 我会假设一个更清洁和便携的解决方案将是malloc内存来保存whoami(以便它进入堆),并且调用函数应释放该内存。
这是目前的计划:
char *devicetype_string (FwdrType devicetype)
{
char *whoami;
switch (devicetype)
{
case FWDR_TYPE__ROUTER:
whoami = "Router";
break;
case FWDR_TYPE__SWITCH:
whoami = "Switch";
break;
default:
whoami = "Fwder Type UNKNOWN";
}
return whoami;
}
foo()
{
. . .
FwderType abc = FWDR_TYPE__ROUTER;
printf ("%s", devicetype_string(abc));
}
这不是内存泄漏,它不是未定义的行为。
在函数devicetype_string
, whoami
指向所有路径中的字符串文字。 字符串文字具有静态存储持续时间,它们不需要被释放。
它的工作原理是因为你要返回一个指向静态字符串的指针,它不是在堆栈上创建的 - 它们具有静态存储持续时间,这意味着它们将在程序期间有效。
看到这个问题
其他要注意的事项:
字符串文字通常存储在只读数据部分中。 试图将一个可写的char*
赋给一个字符串文字,该文字可能是只读的(可能是因为文字存储的地方实际上是平台特定的),然后修改内容会触发未定义的行为,通常是分段错误(试图修改只读属性)唯一数据部分)。
GCC将无法编译,不允许将可写char*
赋给字符串文字。
更好的实现不是分配你的char*
指针,而只是将字符串的地址作为const char*
const char *devicetype_string (FwdrType devicetype)
{
switch (devicetype)
{
case FWDR_TYPE__ROUTER: return "Router";
case FWDR_TYPE__SWITCH: return "Switch";
default: break;
}
return "Fwder Type UNKNOWN";
}
链接地址: http://www.djcxy.com/p/79845.html
上一篇: Is this a memory leak since memory was allocated on stack?
下一篇: Is it a bad manner to use the stack to avoid dynamic allocation?