【问题标题】:What does 'const gchar *' mean, and does that memory need to be freed after use?'const gchar *' 是什么意思,使用后是否需要释放内存?
【发布时间】:2011-05-11 18:18:12
【问题描述】:

我有以下代码:

int main()
{

const gchar *wew = gtk_entry_get_text(GTK_ENTRY(gtkentrywidget));

return 0;
}

gtk_entry_get_text() 返回一个const gchar*,那么wew 是否需要释放,为什么?

【问题讨论】:

  • 我通常不会批评语法、拼写、标点符号或大小写,尤其是因为网站上有许多非英语母语人士,但我无法理解您的意思。您是在询问分配和解除分配,还是需要澄清 const 是什么?请在您的问题中使用正确的英语句子结构。
  • 所有关于分配和解除分配的内容,如果您介意,请回答我向@corynelson 提出的问题,而不是在第一个问题上思考我试图完成的工作......

标签: c string pointers gtk constants


【解决方案1】:

gchar 只是 C 类型 char 的 typedef。您不得释放此特定指针。根据documentation

返回:以字符串形式指向小部件内容的指针。该字符串指向小部件内部分配的存储空间,不得释放、修改或存储。

【讨论】:

  • 好吧-> gchar *wew = (gchar*)gtk_entry_get_text(GTK_ENTRY(gtkentrywidget)); g_free(wew); 一切都很好,为什么可以执行这些?
  • 如果您正在调用 g_free,那么这是未定义的行为 (UB)。当然它可能“看起来”有效,但你不应该这样做。
  • 为什么我不能在它似乎工作的时候这样做?,什么是未定义的行为(UB)是什么意思?
  • 文档告诉你不要这样做。您正在做的事情似乎有效,这只是一个巧合。不要这样做!
  • 你永远不应该释放任何标记为 const 的东西。对象本身通常受其他库的控制,这些库将在以后释放它。释放 const 是未定义的。
【解决方案2】:

gtk_entry_get_text 返回 const gchar* 而不是 gchar* 以防止您尝试释放内存。该函数的文档甚至告诉你。当然如果你把返回的值强制转换为gchar*,你就可以释放它,但这只是因为C语言不会阻止你做傻事。

例如,由于 GtkEntry 内部使用了该内存块,如果您释放该内存块,然后调用 gtk_entry_set_text,您的程序将崩溃。这是因为它尝试写入的内存未分配......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2017-02-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多