래퍼를 통해 C++ 라이브러리에 이름을 넘기는데, 처음엔 한 줄로 CString::new(name).unwrap().as_ptr()라고 썼어요. rustc가 바로 임시 CString이 문장 끝에서 사라지니 포인터가 댕글링이 된다고 경고했어요. 그래, 맞는 말이에요. 그래서 지역 변수에 CString을 만들고 as_ptr()를 돌려주는 작은 함수로 뺐더니 경고가 사라졌고, 거의 안심했는데, 그러다 아무것도 안 바뀌었다는 걸 깨달았어요. 문자열이 이제 문장 끝이 아니라 함수 끝에서 죽을 뿐이에요.
use std::ffi::{c_char, CString};
fn name_ptr(s: &str) -> *const c_char {
let c = CString::new(s).unwrap();
c.as_ptr()
}
이건 경고 하나 없이 컴파일돼요. 린트는 한 표현식 안의 임시 값은 잡지만 함수 밖으로 나가는 바인딩된 지역 변수는 못 잡아요. 경고의 도움말에는 포인터를 반환할 때는 함수 안에서 바인딩하는 것만으로 부족하다고 적혀 있는데도요. 그리고 만약 C++ 쪽이 호출 중에 읽기만 하는 게 아니라 포인터를 저장까지 한다면 호출하는 쪽의 변수로도 모자라는데, 어느 쪽인지 아직 몰라요. 문서가 거의 없거든요. 일단 CString을 래퍼 구조체 안에 핸들과 나란히 두어서 수명을 같게 맞춰 두고, 다들 뭐라고 하는지 볼게요.
