나는 C++에 관해서는 상대적으로 초보자이다. 내가 대학에서 커리큘럼을 많이 사용하는 것은 당연한 일이다. 메모리 관리는 번거롭지 만 ansi C 및 C++에서 번호 책을 구입했습니다. 관련 질문을 훑어 보았지만이 특정 기준과 일치하는 것을 찾지 못했습니다. 아무도 그것을 언급하지 않을 수 있습니다.포인터를 통해 소유하지 않은 동적 배열 삭제하기
이 질문은 저를 괴롭 혔지만 개념적으로 유용하지 않은 것처럼 느낍니다. 가정하자
: 그에서
char original[56];
cstr[0] = 'a';
cstr[1] = 'b';
cstr[2] = 'c';
cstr[3] = 'd';
cstr[4] = 'e';
cstr[5] = '\0';
char *shaved = shavecstr(cstr);
// various operations, calls //
delete[] shaved;
,
char* shavecstr(char* cstr)
{
size_t len = strlen(cstr);
char* ncstr = new char[len];
strcpy(ncstr,cstr);
return ncstr;
}
요점은 문자로 채우고 정기적으로 사본이 면도와 다른 곳에서 사용하고있다 '원본'이 될 버퍼를 가지고있다.
명확하게하기 위해 원본은 std::gets(char* buff)
, std::getline(char* buff, buff_sz)
, std::read(char* buff, buff_sz)
또는 모든 내부 입력 입력 판독기를 통해 채워집니다. 문자열을 '면도'하기 위해 기본적으로 사용되지 않는 배열 공간을 없애 버립니다.
오류는 힙 할당 오류이며, delete[]
에 있습니다.
누출을 방지하기 위해 'shaved'이 보유한 메모리를 해제하여 일부 인수를 통과 한 후에 다시 사용하려고합니다. 아마도 이것이 왜 제한적인지에 대한 충분한 이유가있을 수 있지만이 구성에 따라 메모리를 확보 할 수있는 방법이 있어야합니다. 데이터의 원래 소유자 (포인터)에 액세스 할 수있는 방법이 없습니다.
'원본'버퍼는 어디에 사용됩니까? 'cstr'은'original'입니까? – mch
당신이 가지고있는 문제는 무엇입니까? 컴파일러 오류가 있습니까? 변수 이름이 잘못되었거나 "면도"로 달성하려는 것을 이해하지 못하는 것 외에 문제는 정확히 무엇입니까? C++ 사용에 대해 진지하게 생각하고 있다면,'char *'보다는'std :: string'을 사용해야하며, 전체 메모리 관리 혼란을 피하십시오. – mch
그리고 cstrn은 cstr로되어 있습니까? –