는 이제 다음과 같은 I가 있다고 가정 해 봅시다 해방 될까? 또한 복사 자체에 성능 비용이 있습니까? s
을 동적으로 할당하는 것입니까?포인터를 캡슐화 복사를 통해 구조체를 반환하는
답변
아니요. 포인터를 복사해도 여전히 동일한 위치를 가리키고 있으므로 포인터를 놓을 수 있습니다.
아니요, 함수 호출자가 구조 포인터 멤버에서 free()
을 호출하는 한 메모리가 누출되지 않습니다. 당신이 malloc
, calloc
를 호출하고 동일한 주소에 free
를 호출하지 않을 경우
메모리 누수가 발생합니다
참고는 소유권 의미을 지정합니다. 간단히 말해, 인터페이스는 함수 호출 후에 동적으로 할당 된 포인터 멤버가 호출자의 소유임을 명시 적으로 언급해야합니다. make_struct()
이후
그것에 의해 캡슐화 된 포인터가 메모리 누수 및 해제 할 수 없습니다의
struct s
의 복사본을 반환합니다?
예 구조의 복사본을 반환하지만 shallow copy.
기본적으로 반환 된 구조체 복사본의 포인터 멤버는 s
구조체 포인터 멤버가 가리키는 것과 같은 메모리 위치를 가리킨다는 것을 의미합니다.
호출자가 반환 된 구조체의 포인터 멤버에 free
을 호출하는 한 두 포인터가 동일한 주소를 가리 키므로 누출이 없습니다.
동적으로
s
을 할당하는 것보다 복사 자체에 성능 비용이 있습니까?
동적 할당은 항상 비용이 많이 들고 오류가 발생하기 쉽습니다. 당신이 정말로 필요로하지 않는 한 그것들을 최소한으로 사용하십시오.
왜 그럴까요? 포인터는 할당 된 메모리 자체가 아닙니다. 포인터를 복사하면 자체적으로 메모리를 할당하지 않습니다. 나중에 free()
에 전화하면 올바르게 해제됩니다. . I. E,이 코드는 메모리 누출하지 않습니다하지만 당신이 할당하는 또 다른 접근 방식을 가지고하는 것이 좋습니다 이러한 관점에서 당신이 그것을 가지고, 그 벌금을
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);
}
}
을하는 기능을 가지고뿐만 아니라 할당 된 전체 구조체를 만드는 것
- 1. 구조체를 사용한 캡슐화
- 2. 포인터를 사용하여 구조체를 계산
- 3. Interop에서 포인터를 사용하여 구조체를 반환하는 경우 많은 메모리 공간을 차지합니까?
- 4. 구조체를 반환하는 방법?
- 5. 구조체에 포인터를 반환하는 함수
- 6. 포인터를 반환하는 함수. C에서
- 7. 문자열 포인터를 반환하는 함수
- 8. 노드 포인터를 반환하는 함수
- 9. 구조체를 인터페이스로 반환하는 방법은 무엇입니까?
- 10. 구조체를 반환하는 함수에서 필드를 반환하십시오.
- 11. C의 함수에서 구조체를 반환하는 메커니즘은 무엇입니까
- 12. 구조체를 함수에 전달하고 그 구조체를 통해 루프합니다.
- 13. libxmlrpc 구조체를 통해 반복
- 14. 소켓을 통해 구조체를 전송합니다.
- 15. 포인터를 전달하고 구조체를 가져 오는 Python Ctypes
- 16. 캡슐화
- 17. RTOS - 구조체를 할당하고 대기열을 통해 전달합니다.
- 18. '* this'를 통해 복사를 전달할 때의 이상한 동작
- 19. 클래스에 대한 포인터를 반환하는 함수
- 20. 잘못된 파일 포인터를 반환하는 중
- 21. 포인터를 반환하는 함수에서 null 반환
- 22. 함수에서 Null 포인터를 반환하는 방법
- 23. 함수 포인터에 포인터를 반환하는 함수
- 24. 멤버 데이터를 가리키는 포인터를 반환하는
- 25. 캡슐화 및 객체에 대한 포인터
- 26. C에서 이중 포인터를 통해 구조체 요소에 액세스
- 27. 캡슐화
- 28. 캡슐화
- 29. C 소켓을 통해 구조체를 전송하십시오.
- 30. 포인터를 통해 정렬