2013-12-21 4 views
2

나는 char 포인터와 delete 연산자의 사용 예를 만들려고한다.지정된 메모리 위치에 포인터가 없습니다. delete op의 문제점은 무엇입니까?

char name[] = "subject"; 
char *nameptr = name; 
cout <<"&nameptr: " <<&nameptr<< endl; 
delete [] nameptr; 

나는이 오류가 계속 : 코드는 매우 간단합니다

*** glibc detected *** free(): invalid pointer: 0xbf9e4194 *** 

나는 nameptr 출력에서, 위치 0xbf9e4184로 지적 알고있다. 포인터가 해당 위치 (0xbf9e4194)를 가리 키지 않습니다. 삭제 사용과 관련이 있다고 생각하지만 해결할 수는 없습니다.

+1

짐작으로 프로그래밍하지 마십시오. 체계적으로 언어를 가르치는 좋은 책을 읽으십시오. –

답변

3

new 또는 new []으로 할당 된 메모리에서만 delete 또는 delete []으로 전화해야합니다. "subject"과 같은 문자열 리터럴을 사용할 필요가 없습니다. 여기

하면, 문자의 배열을 가지고 "주제"를 포함 :

+0

귀중한 정보 @ godel9을 보내 주셔서 감사합니다. 나는 한 가지 더 질문이있다. 삭제를 호출 한 후에는 다른 것을 인쇄 할 수 없습니다. 그것은 주말의 끝에 부름을 받아야합니까? – melis

+0

예제에서, 당신은'delete []'를 호출 할 필요가 없습니다. 일반적으로 말해서, 각각의'new/new []'호출마다 하나의'delete/delete []'호출이 있어야합니다. 'new'를 절대로 호출하지 않으면'delete'를 호출 할 필요가 없습니다. – godel9

3

문하여 코드 문을 검사

다음
char name[] = "subject"; 

당신이 언급 한 배열을 가리키는 포인터를 정의 :

char *nameptr = name; 

여기 delete[]아니요, 할당하기 노래 new[] (사실, namenew[] 사용하여 할당되지했다, 당신은 작성하지 않은 : char * name = new char[...]를)

delete [] nameptr; 

그래서, 오류가 (제대로)입니다 감지, 당신이 무언가를 확보하려고하기 때문에 new (또는 malloc)을 사용하여 힙에 할당되지 않습니다.