我相信我这样做是对的,但我想确认一下。在一个程序中,我使用了两个指针,这两个指针指向函数返回的已分配内存。当我使用完那个内存时,我会free()它,然后我会使用同样的指针来指向一个新分配的内存空间。这里是我的程序,给出一个例子来说明我的意思(注释以显示我的思维过程):
int main(void)
{
char *data, *url;
int i = 1;
while(i)
{
printf("Enter URL: ");
if(!(url = getstr())) return 1; //url now points to allocated memory from getstr();
if(strlen(url) <= 0) i = 0;
if(data = readsocket(url, 80, "http")) printf("\n%s\n\n", data); //data now points to allocated memory from readsocket();
else printf("\n\n");
free(url); //free allocated memory that url points to url
free(data); //free allocated memory that data points to data
}
return 0;
}这是正确的吗,还是有更好的更普遍的更好的方法来做到这一点?还是我做的完全错了?
发布于 2012-08-28 21:36:31
假设您的函数getstr和readsocket在内部对内存进行malloc操作,那么这是完全没有问题的。
我唯一的建议是,在与释放内存相同的作用域中分配内存通常是有帮助的,这通常有助于推断何时需要释放内存。
例如:
url = malloc(URL_MAX_LEN);
if (!url) return 1;
if (!getstr(url)) {
free(url);
return 1;
}
/* do something with url */
free(url);如果你有很多对象和退出点,使用goto可以很好的做到这一点。
object1 = malloc(OBJECT1_SIZE);
/* do work, if there's an error goto exit1 */
object2 = malloc(OBJECT2_SIZE);
/* do work, if there's an error goto exit2 */
object3 = malloc(OBJECT3_SIZE);
/* do work, if there's an error goto exit3 */
exit3:
free(object3);
exit2:
free(object2);
exit1:
free(object1);
return 1;如果您的对象变得更加复杂,并且需要大量工作来创建和销毁,那么您可以包装malloc和free,但将与malloc/free完全相同的规则应用于创建/销毁函数以避免泄漏是至关重要的。作为一个好的实践,你应该总是有一个销毁来匹配一个创建,即使它只是包装自由。这样就很难出错了。
struct x *create_x() {
struct x *p = malloc(10);
p->val1 = 7;
return p;
}
void destroy_x(struct x *p) {
free(p);
}发布于 2012-08-28 21:35:59
您的代码没有问题,但是您可以为数据和url预先分配内存,并将它们作为参数传递给getstr和readsocket函数。这将会更有效率。
发布于 2012-08-28 21:36:14
如果函数getstr和readsocket使用例如malloc来分配内存,那么你所做的一切都是可以的。
https://stackoverflow.com/questions/12160385
复制相似问题