C++에서 string 을 char*형식 으로 변환 한 후 난 장 판 문제 해결

질문 출처:
이 진 트 리 의 직렬 화 와 역 직렬 화 를 쓸 때 직렬 화 함수 가 char*Serialize 1(TreeNode*root)인 것 을 발견 하 였 습 니 다.  그 함수 반환 형식 은 char*이지 만 제 가 실현 하 는 과정 에서 더욱 편리 한 조작 을 위해 문자열 을 추가 하기 위해 C++에서 string 형식의 변 수 를 사 용 했 습 니 다.그래서 제 가 마지막 으로 얻 은 결 과 는 res 가 string 형식 입 니 다.만약 에 돌아 가 려 면 char*형식 으로 바 꿔 야 합 니 다.내 가 string 형식 을 char*로 바 꾼 후에 주 함수 에 되 돌아 오 면 어 지 러 운 코드 가 됩 니 다.
먼저 마지막 해결 방법 을 직접 말 하 다.
첫 번 째:char 배열 을 정의 합 니 다.배열 의 길 이 는 stringlength+1 입 니 다.string 의 내용 을 char 배열 에 순서대로 할당 하고 마지막 으로'\0'을 추가 한 다음 char 배열 이름 으로 돌아 가면 됩 니 다.
두 번 째:string 을 클래스 의 구성원 변수 로 정의 합 니 다.
첫 번 째 방법의 코드 를 붙 이 겠 습 니 다.

char *result = new char[res.length() + 1];  //       result  
for (int i = 0; i < res.length(); ++i)
{
   result[i] = res[i];    // string   res     result 
}
result[res.length()] = '\0';  //     \0
그리고 제 가 시도 한 방법 을 말씀 드 리 겠 습 니 다.
시도 1:
처음에 저 는 char*result=&res[0]를 직접 정 의 했 습 니 다.이 문 구 를 통 해 이 string 형식 변수의 첫 주 소 를 직접 되 돌려 주 려 고 했 으 나 실 패 했 습 니 다.주 함수 에서 의 결과 변 수 는'수리 수리 수리 수리 수리 수리 수리 수리'입 니 다.
시도 2:
그래서 나 는 가능 한 원인 을 생각 하기 시작 했다.
1.부분 적 인 변 수 는 함수 에 따라 방출 될 수 있 기 때문에 제 가 돌아 오 는 지침 이 가리 키 는 내용 은 함수 와 함께 방출 되면 서 어 지 러 움 을 초래 했 습 니 다.그러나 평소에 쓴 함수 가 모두 정상 적 으로 돌아 온 다 는 것 을 생각 하 니 이것 은 제 가 곧 부 결 했 습 니 다.그러나 마지막 으로 이 생각 이 옳 았 다 는 것 을 알 게 되 었 습 니 다.평소에 쓰 는 함수 가 정상적으로 돌아 오 는 것 은 유형 변환 과 관련 이 없 기 때문이다.
2.VS 디 버 깅 을 통 해 제 가 사용 하 는 char*result=&res[0]문 구 는 res 의 첫 번 째 요소 주 소 를 되 돌려 주 었 습 니 다.res 의 첫 번 째 주소 가 아 닙 니 다.string 이 std 로 포 장 된 데이터 구 조 는 char*와 같은 C 에서 흡수 된 구 조 를 제외 하고 메모리 할당 allocate 등 으로 인해 메모리 주 소 는 char 배열 처럼 첫 번 째 요소 주소 가 아 닙 니 다.
그래서 저 는 차라리 string 형식의 res 전 체 를 char*형식의 result 에 할당 하고 싶 습 니 다.
그래서 저 는 char*result=(char*)res.data()를 시 도 했 습 니 다.문 구 는 res(res 는 string 형식의 결과)를 result 에 부여 합 니 다.변환 은 성공 적 이지 만 반환 값 은 여전히 유효 하지 않 습 니 다.(또한 이러한 변환 은 스스로\0 끝 자 를 추가 해 야 합 니 다)
그리고 char*result=(char*)res.cstr();결과 도 성 공 했 지만 반환 값 은 여전히 효력 을 잃 었 다.
마지막 으로 new 로 char 배열 을 새로 만 들 고 res 의 내용 을 모두 char 배열 에 복사 한 다음 배열 이름 을 되 돌려 주 는 데 성공 했다.
문제 의 근원
VS 디 버 깅 을 통 해 문제 의 근원 을 발 견 했 습 니 다.res 가 차지 하 는 메모 리 는 함수 가 끝나 면서 방출 되 었 습 니 다.
이것 은 함수 가 실행 되 지 않 은 디 버 깅 인터페이스 입 니 다.

이것 은 실행 완료 디 버 깅 인터페이스 입 니 다.

분명 합 니 다:res 가 없습니다.함수 가 실 행 된 후에 res 메모리 도 풀 렸 고 char 배열 result 는 존재 합 니 다.그들의 차이 점 은 어디 에 있 습 니까?result 는 반환 값 입 니 다.
우 리 는 함수 의 함수 창고 지식 점 을 알 고 있 습 니 다.창고 안에 함수 입구 주소,부분 변수,반환 주소 등 이 저장 되 어 있 습 니 다.result 는 되 돌아 갈 대상 으로서 메모리 공간 이 함수 와 함께 방출 되 지 않 을 것 이 라 고 추측 합 니 다.즉,주 함수 안의 반환 값 은 그 메모리 로 해 야 합 니 다.테스트 를 통 해 이 결론 은 옳 습 니 다.주 함수 의 변 수 는 확실히 반환 값 의 메모 리 를 사용 합 니 다.
여기까지 발 견 했 습 니 다.char*result=(char*)res.c 를 실행 하지만str()문 구 는 result 내 에 완전한 결과 내용(즉 변환 완료)을 만 들 수 있 지만 result 는 string 형식의 res 가 방출 되면 서 char*형식의 result 가 가리 키 는 메모리 공간 내용 이 모두 비 워 집 니 다.마지막 으로 result 가 가리 키 는 공간 으로 돌 아 왔 지만 그 안의 내용 은 이미 비 워 졌 다.마치 메모 리 를 땅 에 비유 하 는 것 과 같다.res 는 먼저 그 위 에 집 을 지 었 고 위 에서 문 구 를 바 꾼 후에 result 도 집의 주인 이다.이번 에는 집 에 두 명의 주인 이 있 으 면 그들 은 모두 집 을 조작 할 수 있다.그들 이 모두 조작 을 할 수 있 기 때문에 그들 이 속 한 함수 가 끝나 면 res 기한 이 다가 올 때 res 는 자신 이 세운 집 을 소각 했다.그럼 result 도 살 집 이 없어 요.즉,그들 이 사용 하 는 메모리 가 초기 화 되 었 습 니 다.이때 주 함 수 는 주 소 를 되 돌려 받 았 지만 그 주 소 는 이미 내용 이 없습니다.난리 가 났 습 니 다.
여기까지 문제 의 근원 을 알 수 있다.그러면 해결 방법 도 매우 뚜렷 하 다.1.메모리 분리,res 와 result 의 소속 메모리 주 소 를 분리 한다.2.res 가 있 는 메모리 가 함수 가 끝 날 때 방출 되 지 않도록 방법 을 강구 합 니 다.
구체 적 인 실현:
첫 번 째.위 에 있 는 new 새 char*변수의 코드 입 니 다.result 를 위해 공간 을 다시 개척 합 니 다.
두 번 째 i:클래스 에서 res 를 클래스 의 구성원 변수 나 static 구성원 변수 로 설정 하면(안 하 는 것 이 좋 습 니 다.성공 할 수 있 지만 새로운 문제 가 발생 할 수 있 습 니 다)그들 은 구성원 함수 의 끝 에 따라 방출 되 지 않 습 니 다.차이 점 은 일반 구성원 변 수 는 대상 의 방출 에 따라 방출 되 고 static 는 그렇지 않 으 며 정적 저장 소 에 저 장 됩 니 다.
ii:C 와 같은 프로 세 스 코드 는 res 를 전역 변수 로 설정 하면 됩 니 다.
C++에서 string 을 char*형식 으로 변환 한 후 코드 문제 해결 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++에서 string 을 char*형식 으로 변환 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기