---
name: "curl_multi_cleanup"
section: "3"
platform: "macos"
package: "curl"
version: "166.0.0.0.1"
release: "macOS 26.5"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/curl_multi_cleanup"
---

# curl\_multi\_cleanup(3)

close down a multi session

## NAME

curl\_multi\_cleanup - close down a multi session

## SYNOPSIS

```
#include <curl/curl.h>
CURLMcode curl_multi_cleanup(CURLM *multi_handle);
```

## DESCRIPTION

Cleans up and removes a whole multi stack. It does not free or touch any individual easy handles in any way - they still need to be closed individually, using the usual *[curl\_easy\_cleanup(3)](/curl_easy_cleanup/3.md)* way. The order of cleaning up should be:

1 - *[curl\_multi\_remove\_handle(3)](/curl_multi_remove_handle/3.md)* before any easy handles are cleaned up

2 - *[curl\_easy\_cleanup(3)](/curl_easy_cleanup/3.md)* can now be called independently since the easy handle is no longer connected to the multi handle

3 - *[curl\_multi\_cleanup(3)](/curl_multi_cleanup/3.md)* should be called when all easy handles are removed

Passing in a NULL pointer in *multi\_handle* makes this function return CURLM\_BAD\_HANDLE immediately with no other action.

## EXAMPLE

```
int main(void)
{
  CURLM *multi = curl_multi_init();
  /* when the multi transfer is done ... */
  /* remove all easy handles, then: */
  curl_multi_cleanup(multi);
}
```

## AVAILABILITY

Added in 7.9.6

## RETURN VALUE

CURLMcode type, general libcurl multi interface error code. On success, CURLM\_OK is returned.

## SEE ALSO

[**curl\_easy\_cleanup**(3)](/curl_easy_cleanup/3.md), [**curl\_easy\_init**(3)](/curl_easy_init/3.md), [**curl\_multi\_get\_handles**(3)](/curl_multi_get_handles/3.md), [**curl\_multi\_init**(3)](/curl_multi_init/3.md)
