Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过封装指针的copy返回结构_C_Memory Management_Memory Leaks_Heap - Fatal编程技术网

通过封装指针的copy返回结构

通过封装指针的copy返回结构,c,memory-management,memory-leaks,heap,C,Memory Management,Memory Leaks,Heap,假设我有以下几点: typedef struct a_struct_s { int* dynamic_pointer; } a_struct; a_struct make_struct( int length ) { a_struct s; s.dynamic_pointer = calloc( sizeof( int ), length ); // [check here to see if s.dynamic_pointer was allocate

假设我有以下几点:

typedef struct a_struct_s
{
     int* dynamic_pointer;
}
a_struct;

a_struct make_struct( int length )
{
     a_struct s;
     s.dynamic_pointer = calloc( sizeof( int ), length );
     // [check here to see if s.dynamic_pointer was allocated]

     return s;
}

由于
make_struct()
将返回结构
s
的副本,因此它封装的指针是否会泄漏内存而无法释放?另外,与动态分配
s
相比,复制本身是否存在性能成本?

否。即使复制指针,它仍然指向相同的位置,因此您可以释放它。

否。即使复制指针,它仍然指向相同的位置,因此您可以释放它。

否,只要函数的调用方调用结构指针成员上的
free()
,它就不会泄漏内存

记住规则:
当您调用
malloc
calloc
并且从不在同一地址上调用
free
时,会发生内存泄漏。只要这样做,就不会出现内存泄漏。

请注意,从函数返回动态分配的指针时,指定所有权语义非常重要。简而言之,您的接口应该明确指出,在函数调用之后,动态分配的指针成员由调用方拥有

由于
make_struct()
将返回
struct s
的副本,它封装的指针是否会泄漏内存而无法释放?

是,返回结构副本,但返回
基本上,这意味着结构副本返回的指针成员指向的内存位置与
s
的结构指针成员指向的内存位置相同 由于两个指针指向相同的地址,只要调用方调用返回结构的指针成员上的
free
,就不会发生泄漏

拷贝本身与动态分配
s
相比是否存在性能成本?


动态分配总是代价高昂,而且更容易出错。尽量少使用它们,除非您确实需要它们。

否,只要函数调用方调用结构指针成员上的
free()
,它就不会泄漏内存

记住规则:
当您调用
malloc
calloc
并且从不在同一地址上调用
free
时,会发生内存泄漏。只要这样做,就不会出现内存泄漏。

请注意,从函数返回动态分配的指针时,指定所有权语义非常重要。简而言之,您的接口应该明确指出,在函数调用之后,动态分配的指针成员由调用方拥有

由于
make_struct()
将返回
struct s
的副本,它封装的指针是否会泄漏内存而无法释放?

是,返回结构副本,但返回
基本上,这意味着结构副本返回的指针成员指向的内存位置与
s
的结构指针成员指向的内存位置相同 由于两个指针指向相同的地址,只要调用方调用返回结构的指针成员上的
free
,就不会发生泄漏

拷贝本身与动态分配
s
相比是否存在性能成本?


动态分配总是代价高昂,而且更容易出错。尽量少用它们,除非你真的需要它们,否则不要使用。

为什么?指针本身不是分配的内存-如果复制指针,指针本身不会分配内存。如果以后对它调用
free()
,它将被正确释放。即,此代码不会泄漏内存:

a_struct s = make_struct(10);
free(s.dynamic_pointer);

为什么会这样?指针本身不是分配的内存-如果复制指针,指针本身不会分配内存。如果以后对它调用
free()
,它将被正确释放。即,此代码不会泄漏内存:

a_struct s = make_struct(10);
free(s.dynamic_pointer);

不,从这个角度看,它是很好的,但是您可能想考虑另一种分配方法,因为用内存块指针返回一个值结构可能不那么明显,调用方需要释放其中一个成员。 一种方法是让整个结构也被分配,然后让一个函数释放结构

a_struct* alloc_struct( int length )
{
     a_struct s = calloc( 1, sizeof(a_struct) );
     s->dynamic_pointer = calloc( sizeof( int ), length );
     return s;
}

void free_struct( a_struct *p )
{
    if ( p != NULL )
    { 
      free( p->dynamic_pointer );
      free(p);
    }
}

不,从这个角度看,它是很好的,但是您可能想考虑另一种分配方法,因为用内存块指针返回一个值结构可能不那么明显,调用方需要释放其中一个成员。 一种方法是让整个结构也被分配,然后让一个函数释放结构

a_struct* alloc_struct( int length )
{
     a_struct s = calloc( 1, sizeof(a_struct) );
     s->dynamic_pointer = calloc( sizeof( int ), length );
     return s;
}

void free_struct( a_struct *p )
{
    if ( p != NULL )
    { 
      free( p->dynamic_pointer );
      free(p);
    }
}