• How to distinguish between strings in heap or literals?


    Question:

    I have a use case where I can get pointers of strings allocated either in memory or literals. Now the latter can't be freed so that's a problem if I pass the wrong one. Is there a way to know which one is allocated and which not?

    char *b = "dont free me!";
    if(!IS_LITERAL(b)) {
        free(b);
    }

    I imagine something like that.

    My example:

    Scenario 1: literal

    char *b = "dont free me!";
    scruct elem* my_element = mylib_create_element(b);
    // do smth
    int result = mylib_destroy_element(my_element); // free literal, very bad

    Scenario 2: in heap

    char *b = malloc(sizeof(char)*17); // example
    strncpy(b, "you can free me!",17);
    
    scruct elem* my_element = mylib_create_element(b);
    // do smth
    int result = mylib_destroy_element(my_element); // free heap, nice

    How the user calls mylib_create_element(b); is not under my control. If he frees before mylib_destroy_element it can crash. So it has got to be mylib_destroy_element that cleans up.


    Answer:

    I've had a similar case recently. Here's what I did:

    If you're making an API that accepts a string pointer and then uses it to create an object (mylib_create_element), a good idea would be to copy the string to a separate heap buffer and then free it at your discretion. This way, the user is repsonsible for freeing the string he used in the call to your API, which makes sense. It's his string, after all.

    Note that this won't work if your API depends on the user changing the string after creating the object
  • 相关阅读:
    无废话设计模式(7)结构型模式--装饰模式
    无废话设计模式(6) 结构型模式--适配器模式
    无废话设计模式(5)结构型模式--桥接模式
    无废话设计模式(4)原型模式
    Java进阶--Map集合
    Java进阶--List接口
    Java进阶--集合泛型综合应用案例(斗地主)
    Java进阶--泛型
    Java进阶--Iterator迭代器
    Java进阶--Collection集合
  • 原文地址:https://www.cnblogs.com/vigorz/p/10499221.html
Copyright © 2020-2023  润新知