Como parar o vazamento de memória ao usar `as_ptr ()`?

Como é a primeira vez que estou aprendendo programação de sistemas, estou tendo dificuldades para entender as regras. Agora, fiquei confuso sobre vazamentos de memória. Vamos considerar um exemplo. Digamos, Rust está jogando um ponteiro (para uma string) que Python vai pegar.

Em Rust, (estou apenas enviando o ponteiro doCString)

use std::ffi::CString;

pub extern fn do_something() -> *const c_char {
    CString::new(some_string).unwrap().as_ptr()
}

Em Python, (estou desreferenciando o ponteiro)

def call_rust():
    lib = ctypes.cdll.LoadLibrary(rustLib)
    lib.do_something.restype = ctypes.c_void_p
    c_pointer = lib.do_something()
    some_string = ctypes.c_char_p(c_pointer).value

Agora, minha pergunta é sobre liberar a memória. Eu pensei que deveria ser liberado em Python, mas a propriedade aparece. Porque,as_ptr parece ter uma referência imutável. Então, fiquei confuso sobre se eu deveria liberar a memória no Rust ou Python(ou ambos?). Se for Rust, como devo liberá-lo quando o fluxo de controle retornar ao Python?