繁体   English   中英

返回内容后如何释放指针

[英]how to free a pointer after it returned its content

这是我的代码,在调用new_double_size后如何释放它。 我是C语言的初学者,因此感谢您的帮助。

size_t get_doubled_size(Vector *vtr, size_t new_size){
   size_t *new_double_size = malloc(sizeof(size_t));
   *new_double_size = vtr -> capacity;
   while(new_size > *new_double_size){
     *new_double_size *= 2;
   }
   return *new_double_size;
}

在另一个地方,我这样称呼:

int doubled_size = get_doubled_size(....);

显然,您需要在释放它之前获取它的值,例如:

size_t return_value = *new_double_size;
free(new_double_size);
return return_value;

但是在这种情况下,您甚至不需要为新的大小分配空间……只需直接使用size_t变量即可。

要控制变量的生存期,仅应使用malloc 在这种情况下,您不需要这样做,可以编写得更简单:

size_t get_doubled_size(Vector *vtr, size_t new_size)
{
     size_t new_double_size = vtr -> capacity;
     while(new_size > new_double_size)
         new_double_size *= 2;
     return new_double_size;
}

我们无能为力,因为我们不知道Vector是什么。

我建议使用弹性数组成员,并让每个更改或变异向量的函数返回一个新向量(如果它以弹性数组成员结尾)。

或至少具有一个void grow_vector(Vector*vec, unsigned newsize)函数。

通常,在C语言中,您应该有充分记录的内存管理约定,并记录谁负责释放内存。 通常,您会创建构造函数和析构函数。

当函数退出时,变量本身不再存在。 但这无关紧要。 调用约定可确保返回值返回给调用者。 您不能做的是返回函数局部变量的地址:

int *foo( void ) {
   int i = 42; 
   return &i;
} 

在这种情况下, i的地址可以正确返回,但是由于函数返回后i不再存在(超出范围),因此无法以任何有意义的方式使用。

此答案的文字来自Alan Au的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM