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

我有一个设备可以是“路由器”或“开关”。 我使用下面的函数,传递给它一个返回字符串的枚举。 我的问题是,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_stringwhoami指向所有路径中的字符串文字。 字符串文字具有静态存储持续时间,它们不需要被释放。


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

看到这个问题

其他要注意的事项:

字符串文字通常存储在只读数据部分中。 试图将一个可写的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?