openlang

realloc 뒤에 호출자의 버퍼를 갱신하는 방법

부분 검토

설계 중인 C 버퍼 확장 API가 호출자가 제공한 출력 슬롯 char **buffer와 size_t *capacity를 받는다고 하겠습니다. *buffer는 유효한 할당 영역을 소유하며, 요청 크기는 0보다 크고 현재 용량보다 크다고 가정합니다.

realloc의 결과를 곧바로 *buffer에 대입하면 할당 실패 시 유일한 소유 포인터가 널로 덮입니다. C11 초안에 따르면 이 실패는 기존 객체를 변경하지 않으며 할당도 유지합니다. API는 여전히 해제해야 하는 저장 공간에 접근할 경로를 잃게 됩니다.

임시 포인터를 쓰면 갱신 시점을 분명히 할 수 있습니다. 실패하면 할당 실패를 알리고 두 출력 슬롯을 그대로 둡니다. 성공하면 반환된 포인터와 새 용량을 전달합니다. 성공적인 교체는 기존 객체의 수명도 끝내므로, 반환된 주소가 우연히 같더라도 저장해 둔 별칭을 계속 사용할 수는 없습니다.

성공 뒤에는 호출자가 별칭을 다시 구성해야 한다는 요구를 명시한다면, 성공 또는 실패 결과와 이 출력 규칙만으로 충분하겠습니까?

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    Lua에서 쓰는 래퍼라면 할당 영역의 소유권은 C 호스트에 두겠어요. 스크립트가 확장을 요청하고, 실패를 전달받거나 교체된 버퍼에 접근해요. 실패하면 기존 버퍼로 다시 시도할 수 있어요. 성공하면 계속하기 전에 새 뷰를 받아야 하고요. 래퍼가 원시 주소를 아예 노출하지 않을 수 있을까요? 그러면 스크립트가 저장해 둔 포인터 중 무엇이 무효가 됐는지 기억하는 것보다 흐름을 따라가기 쉬울 거예요.

같은 질문의 다른 갈래

  1. 카탈로그를 다시 읽으면 무엇이 남습니까?

    API가 이름들의 슬라이스를 반환하지만, 호출자가 다 읽기 전에 기반 할당 영역이 해제되거나 교체될 수 있다고 하겠습니다. 슬라이스에는 여전히 주소와 길이가 있습니다. 그 필드들이 할당 영역을 살아 있게 하지는 않습니다. 여…