char * = "string" 또는 char * = new char[6]을 제거해야 합니까?

StackOverflow https://stackoverflow.com/questions/51592

  •  09-06-2019
  •  | 
  •  

문제

나는 다음과 같이 가정한다 char* = "string" 와 동일하다 char* = new char[6].나는 이 문자열이 스택 대신 힙에 생성된다고 생각합니다.그렇다면 사용을 마친 후 해당 항목을 삭제하거나 메모리를 해제해야 하나요? 아니면 자동으로 삭제되나요?

도움이 되었습니까?

해결책

아니요.문자열을 수동으로 해제하려면 수동으로 메모리를 할당해야 합니다. malloc 함수(C) 또는 new 연산자(C++).사용하지 않는 경우 malloc 또는 new, 그런 다음 char* 또는 문자열이 스택에 생성되거나 컴파일 타임 상수로 생성됩니다.

다른 팁

아니요.네가 말할 때:

const char* c = "Hello World!";

다음과 동일하지 않은 "기존" 문자열 상수에 c를 할당합니다.

char* c = new char[6];

후자의 경우에만 힙에 메모리를 할당합니다.따라서 완료되면 delete를 호출합니다.

내가 할 때 나는 가정한다 char* = "string" 그거랑 똑같아 char* = new char[6].

아니요.첫 번째 작업은 상수를 만드는 것입니다.이를 수정하는 것은 정의되지 않은 동작입니다.하지만 귀하의 질문에 대답하자면;아니요, 그들을 파괴할 필요는 없습니다.그리고 참고사항은 항상 사용하세요. std::string 언제든지 가능할 때.

게임 이름은 "당신이 만든 것만 파괴하세요"입니다.쌍은 다음과 같습니다.

  1. malloc/free
  2. calloc/free
  3. new/delete
  4. new []/delete []

다음을 사용하여 두 번째 문자열을 만들었으므로 new [], 그것을 파괴할 책임은 당신에게 있습니다 delete [].부르다 delete [] string2 완료되면.

이제 코드가 너무 복잡하고 삭제 내용을 추적하기 어렵다면 범위 포인터나 자동 포인터 사용을 고려해 보세요.그만큼 boost::scoped_ptr 부스트 라이브러리의 클래스는 시작하기에 좋은 곳입니다.또한 라이 관용구, 꽤 편리하고 유용한 것입니다.

그들은 동일하지 않습니다.첫 번째 예는 상수 문자열이므로 확실히 힙에서 할당되지 않습니다.두 번째 예는 6자의 런타임 메모리 할당이며 이는 힙에서 비롯됩니다.첫 번째 예를 삭제하고 싶지는 않지만 삭제해야 합니다. delete [] 두 번째 예입니다.

문자열 리터럴이 어디에 저장되어 있는지 알 수 없습니다.읽기 전용 메모리일 수도 있으므로 코드는 다음과 같아야 합니다.

const char* c = "string";

그리고 새로운 char 배열은 다음과 같아야합니다 삭제d 동적으로 할당된 다른 메모리 영역과 같습니다.

new는 항상 할당인 반면, 문자열 인라인을 정의하면 실제로 프로그램 자체에 데이터가 포함되어 변경될 수 없습니다(일부 컴파일러에서는 똑똑한 트릭으로 이를 허용하므로 신경쓰지 마세요).

일부 컴파일러는 버퍼를 수정할 수 없도록 인라인 문자열을 입력합니다.

char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted

GCC 4.8 x86-64 Linux의 기능을 살펴보겠습니다.

프로그램:

#include <cstdio>
int main() {
    const char *s = "abc";
    char *sn = new char[4];
    sn[3] = '\0';
    std::printf("%s\n", s);
    std::printf("%s\n", sn);
}

컴파일 및 디컴파일:

g++ -ggdb -std=c++98 a.cpp
objdump -CSr a.o

출력에는 다음이 포함됩니다.

  const char *s = "abc";
 8:   48 c7 45 f0 00 00 00    movq   $0x0,-0x10(%rbp)
 f:   00 
                     c: R_X86_64_32S .rodata
  char *sn = new char[4];
10:   bf 04 00 00 00          mov    $0x4,%edi
15:   e8 00 00 00 00          callq  1a <main+0x1a>
                        16: R_X86_64_PC32       operator new[](unsigned long)-0x4
1a:   48 89 45 f8             mov    %rax,-0x8(%rbp)

해석:

  • char *s = "abc" 로 전환 .rodata.그래서 당신은 할 수 없습니다 free 어떤 식으로든요.
  • char *sn = new char[4]; 의 출력에서 ​​​​온다 operator new[].따라서 가능하면 해제해야 합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top