0

나는 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'이 보유한 메모리를 해제하여 일부 인수를 통과 한 후에 다시 사용하려고합니다. 아마도 이것이 왜 제한적인지에 대한 충분한 이유가있을 수 있지만이 구성에 따라 메모리를 확보 할 수있는 방법이 있어야합니다. 데이터의 원래 소유자 (포인터)에 액세스 할 수있는 방법이 없습니다.

+0

'원본'버퍼는 어디에 사용됩니까? 'cstr'은'original'입니까? – mch

+1

당신이 가지고있는 문제는 무엇입니까? 컴파일러 오류가 있습니까? 변수 이름이 잘못되었거나 "면도"로 달성하려는 것을 이해하지 못하는 것 외에 문제는 정확히 무엇입니까? C++ 사용에 대해 진지하게 생각하고 있다면,'char *'보다는'std :: string'을 사용해야하며, 전체 메모리 관리 혼란을 피하십시오. – mch

+0

그리고 cstrn은 cstr로되어 있습니까? –

답변

1

originalcstr으로 대체한다고 가정합니다. 그렇지 않으면 cstr이 선언되지 않았으므로 코드가 컴파일되지 않습니다.

여기서 오류는 할당 된 배열의 크기가 너무 작습니다. char* ncstr = new char[len+1];은 종료 \0을 설명하려고합니다. 당신이 바로 함수가 반환 후 shaved을 삭제하면

또한

은 ...

[*] 조금 더 깊게하기 위해, cstr에 사용되는 메모리가 해제 될 때 함수를 호출 의미가 없습니다 contains 함수가 반환됩니다. 일반적으로 이러한 정적 문자열은 응용 프로그램의 전체 기간 동안 유지되는 상수에 배치됩니다. 예를 들어 const char* cstr="abcde";을 모든 기능 밖에 포함 할 수 있습니다. 그런 다음 동적으로 할당하지 않고이 문자열을 전달할 수 있습니다.

0

은 당신은 당신은 cstr을 삭제해서는 안 cstr 대신 cstrn ...

사용하는 의미 가정하면. shaved을 삭제해야합니다.

deletenew으로 할당 된 메모리 만 사용자에게 제공됩니다. new[]으로 할당 된 메모리는 delete[]입니다.

는 단순히 메모리 주소를 보유하는 변수입니다. 해당 메모리 주소를 delete[]으로 전달하여 메모리를 제거하십시오. shavednew[]으로 할당 된 메모리의 메모리 주소를 보유합니다.