How to distinguish between strings in heap or literals?
来源:互联网 发布:网络通信公司简介 编辑:程序博客网 时间:2024/05/09 00:10
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 smthint result = mylib_destroy_element(my_element); // free literal, very bad
Scenario 2: in heap
char *b = malloc(sizeof(char)*17); // examplestrncpy(b, "you can free me!",17);scruct elem* my_element = mylib_create_element(b);// do smthint 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 beforemylib_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 tocopy 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.
- How to distinguish between strings in heap or literals?
- How to distinguish between 32 and 64-bit JVM
- Distinguish between pointers and references in C++
- How to distinguish a human and a robot in the future?
- How to compare Strings in Java
- How to move between two or more forms?
- How to format strings in an array in ruby?
- How to add dividers and spaces between items in RecyclerView?
- distinguish between variable and field
- Distinguish between index of a decimal number and integer inside an array in Ruby?
- Difference between Stack and Heap in Java
- How to capture the one-to-one dependency between two attributes in one relation?
- How to create an Excel sheet or chart in VC?
- how to enable or disable registry editing in xp
- How to create an Excel sheet or chart in VC?
- How to identify rail0 or ral1 in RAL transaction
- How to filter the ManyToManyField or ForeignKey in modelForm?
- Qt, how to add radio button or checkbox in menu
- The Most Simple Introduction to Hypothesis Testing
- nachos priority scheduler with nonation
- power of the test
- Is the “*apply” family really not vectorized?
- POJ_2513_Colored Sticks(欧拉路+字典树)
- How to distinguish between strings in heap or literals?
- 深入理解内存地址
- Remove element
- java 多线程学习笔记之 线程互斥
- ******************** C语言的基础 ********************
- sorting - shell sort
- ******************** 注释,标示符,关键字 ********************
- Second Highest Salary
- ******************** 常 量 ********************