홈>
char *를 함수에 전달하면 그런 다음 char을 가져 와서 std :: string으로 변환하고 결과를 얻은 후에 std :: string에서 char *로 다시 변환하여 결과를 표시합니다.
<올>따라야 할 단계
<올>가능한 경우 참조 대 포인터를 통해 어떻게 수행 될 수 있는지 볼 수 있습니까 (주소로 값을 전달하지만 포인터가 가리키는 값을 여전히 수정할 수 있습니다. 그래서 포인터 주소의 사본이 함수가 파괴되었지만 여전히 변경된 값을 외부에서 볼 수 있습니다.
감사합니다!
- 답변 # 1
- 답변 # 2
귀하가 반환하는 포인터에서 메모리를 처리하는 방법을 관찰해야합니다. 예를 들어 fn ()이 종료되면 std :: string에 할당 된 메모리가 해제되므로 아래 코드는 작동하지 않습니다.
const char* fn(const char*psz) { std::string s(psz); // do something with s return s.c_str(); //BAD }
하나의 해결책은 함수에 메모리를 할당하고 함수의 호출자가 메모리를 해제하도록하는 것입니다 :
또는 문자열 크기의 상한을 아는 경우 스택에서 직접 만들고 포인터를 전달할 수 있습니다 (예 :const char* fn(const char*psz) { std::string s(psz); // do something with s char *ret = new char[s.size()]; //memory allocated strcpy(ret, s.c_str()); return ret; } .... const char* p = fn("some text"); //do something with p delete[] p;// release the array of chars
void fn(const char*in size_t bufsize, char* out) { std::string s(psz); // do something with s strcpy_s(out, bufsize, s.c_str()); //strcpy_s is a microsoft specific safe str copy } .... const int BUFSIZE = 100; char str[BUFSIZE]; fn("some text", BUFSIZE, str); //ok to use str (memory gets deleted when it goes out of scope)
- 답변 # 3
라이브러리의 가비지 수집기를 유지 관리 할 수 있습니다. 와이즈 비즈 라이브러리 'lib'에서 액세스 할 수 있습니다. 나중에
std::vector<char*> g_gc;
를 호출하여 편리하게 g_gc의 모든 포인터를 해제 할 수 있습니다lib::release_garbage();
release_garbage 함수는 다음과 같습니다 :
단일 스레드 모델에서는이 g_gc를 정적으로 유지할 수 있습니다. 다중 스레드 모델에는 잠금/잠금 해제가 포함됩니다.char* lib::func(char*pStr) { std::string str(pStr); char *outStr = new char[str.size()+1]; strcpy(outStr, str.c_str()); g_gc.push_back(outStr); // collect garbage return outStr; }
void lib::release_garbage() { for(int i=0;i<g_gc.size();i++) { delete g_gc[i]; } g_gc.clear(); }
관련 자료
- java - char 배열에 문자열을 어떻게 추가합니까?
- c - memcpy를 사용하여 char **를 복사하는 방법
- [A, B, C]와 같은 문자열을 A B C (Java)로 분할하려면 어떻게해야합니까?
- go - 문자열을 룬으로 변환하는 방법은 무엇입니까?
- 문자열을 어떻게 반복합니까? (자바)
- R에서 시간 데이터를 간격으로 어떻게 분할합니까?
- sql - 문자열의 일부만 가져 오는 방법
- Powershell에서 json을 해시로 변환하는 방법은 무엇입니까?
- javascript - ASPNET Core MVC에서 js 문자열을 C #에 게시하는 방법
- git - gitk에 더 나은 복사 감지 기능을 추가하는 방법은 무엇입니까?
- c++ - 파일에서 포인터 벡터로 데이터 복사
- drupal - 파일을 파일 엔티티로 변환하는 방법
- google apps script - Googlesheet의 새 데이터를 동일한 순서로 복사하는 방법
- node.js - 배열의 배열을 파일에 어떻게 저장합니까?
- javascript - 화면에 경고가있는 텍스트를 복사하는 방법
- conditional statements - 계획 - cond에서 문자열을 읽는 방법
- flutter - 문자열 날짜를 날짜 시간으로 변환하는 방법?
- vector : 파일에서 Vec으로 숫자 목록을 읽는 방법은 무엇입니까?
- python - 목록의 모든 항목에 대해 문자열의 일부를 이동하는 방법
- scala에서 csv 파일을 맵으로 읽는 방법
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
char*
변환std::string
에 :std::string
변환char*
에 :나는
std::vector<char>
를 사용하는 것을 선호합니다 실제char*
대신 ;자신의 메모리를 관리 할 필요가 없습니다 :