这是内存泄漏,因为内存是在堆栈上分配的吗?

时间:2014-09-09 05:51:39

标签: c memory memory-management stack heap

我的设备可以是“路由器”或“交换机”。我使用下面的函数,传递一个枚举,返回我的字符串。我的问题是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));
}

2 个答案:

答案 0 :(得分:7)

这不是内存泄漏,也不是未定义的行为。

在函数devicetype_string中,whoami指向所有路径中的字符串文字。字符串文字具有静态存储持续时间,不需要释放它们。

答案 1 :(得分:2)

它的工作原理是你返回一个指向静态字符串的指针,这个字符串没有在堆栈上创建 - 它们具有静态存储持续时间,这意味着它们在程序的持续时间内有效。 / p>

请参阅this question

需要注意的其他事项:

字符串文字通常存储在只读数据部分中。尝试将可写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";
}