概述
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.
转载于:https://www.cnblogs.com/vigorz/p/10499221.html
最后
以上就是开放犀牛为你收集整理的How to distinguish between strings in heap or literals?的全部内容,希望文章能够帮你解决How to distinguish between strings in heap or literals?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复