通过封装指针的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);
}
}