2013-01-22 2 views

답변

2

아니요. 포인터를 복사해도 여전히 동일한 위치를 가리키고 있으므로 포인터를 놓을 수 있습니다.

1

아니요, 함수 호출자가 구조 포인터 멤버에서 free()을 호출하는 한 메모리가 누출되지 않습니다. 당신이 malloc, calloc를 호출하고 동일한 주소에 free를 호출하지 않을 경우
메모리 누수가 발생합니다

규칙을 기억하십시오. 당신이하는 한, 메모리 누출은 없습니다. 함수에서 동적으로 할당 된 포인터를 반환 할 때 매우 중요하다고

참고는 소유권 의미을 지정합니다. 간단히 말해, 인터페이스는 함수 호출 후에 동적으로 할당 된 포인터 멤버가 호출자의 소유임을 명시 적으로 언급해야합니다. make_struct() 이후

그것에 의해 캡슐화 된 포인터가 메모리 누수 및 해제 할 수 없습니다의 struct s의 복사본을 반환합니다?

예 구조의 복사본을 반환하지만 shallow copy.
기본적으로 반환 된 구조체 복사본의 포인터 멤버는 s 구조체 포인터 멤버가 가리키는 것과 같은 메모리 위치를 가리킨다는 것을 의미합니다.
호출자가 반환 된 구조체의 포인터 멤버에 free을 호출하는 한 두 포인터가 동일한 주소를 가리 키므로 누출이 없습니다.

동적으로 s을 할당하는 것보다 복사 자체에 성능 비용이 있습니까?

동적 할당은 항상 비용이 많이 들고 오류가 발생하기 쉽습니다. 당신이 정말로 필요로하지 않는 한 그것들을 최소한으로 사용하십시오.

2

왜 그럴까요? 포인터는 할당 된 메모리 자체가 아닙니다. 포인터를 복사하면 자체적으로 메모리를 할당하지 않습니다. 나중에 free()에 전화하면 올바르게 해제됩니다. . I. E,이 코드는 메모리 누출하지 않습니다하지만 당신이 할당하는 또 다른 접근 방식을 가지고하는 것이 좋습니다 이러한 관점에서 당신이 그것을 가지고, 그 벌금을

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

없음을 가진 값으로 구조체를 반환하기 때문에 호출자가 메모리 블록에 대한 멤버를 해방시킬 필요가있는 메모리 블록에 대한 포인터가 그리 명확하지 않을 수 있습니다.

한 가지 방법은 다음 무료 구조체

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); 
    } 
} 
을하는 기능을 가지고뿐만 아니라 할당 된 전체 구조체를 만드는 것
관련 문제