2012-10-29 5 views
2

삭제 char을 삭제하려고하면 액세스 위반 오류가 발생합니다. Heres는* char []

내 코드 :

int main() 
{ 
    char *myString = new char[32]; 
    myString = "Hello"; 
    cout << myString; 
    cin.get(); 

    delete [] myString; 
    return 0; 
} 

필자는

delete myString 

을 시도하지만, 메신저, 여전히 라인업

myString = "Hello"; 

포인터 후 액세스 위반 오류를

+3

를 사용하려는 경우 더 나은 cpp/string/basic_string) 문자열을 처리 할 때 포인터 대신. –

답변

8

를 얻을 myString은 더 이상 할당 한 배열을 가리 키지 않지만 문자열 리터럴을 가리 킵니다. 라인

delete [] myString; 

는 (충돌을 초래하는) 리터럴을 삭제하려고 시도합니다.

strcpy 또는 더 나은 방법으로 std::string을 사용하여 문자열을 복사 할 수 있습니다.

std::string myString = "Hello"; 
cout << myString; 
+0

고마워,하지만 어떻게 힙에 C 스타일의 문자열을 초기화합니까? strcpy를 사용해야합니까? – user1352609

+0

@ user1352609'strdup()'을 사용하십시오. 내 대답을 참조하십시오. –

+3

* std :: string을 사용할 수 없다면 (왜?), 그렇다면'strcpy'를 사용해야합니다. – avakar

0

"Hello"가 할당 된 memeory를 삭제하려고합니다. 포인터 대신 내용을 복사하려면 strcpy를 사용해야합니다.

4
char *myString = new char[32]; 
myString = "Hello"; 

이 (상수 "안녕하세요"문자열로, 구체적으로) 뭔가에 myString 변수를 재 할당합니다. 그러지 마. 당신이 정말 문자 포인터를해야하는 경우,

strcpy(myString, "Hello"); 

또는

char *myString = strdup("Hello"); 

더 나은를 사용하고

free(myString); 

대신

delete [] myString; 

사용하여 할당 된 메모리를 해제한다 오류가 될 것입니다.

그러나 하지 마십시오. 대신 std::string을 사용하십시오.

+2

스트러 프가 더 좋은 이유는 무엇입니까? 그것은 표준의 일부조차도 아닙니다. 그리고 이것을 권하고 싶다면'delete []'가 아닌'free()'를 포인터에 써야한다고 언급해야합니다. –

+0

@BenjaminLindley 경계 밖으로 쓸 가능성이 없기 때문에. 'strcpy()'는 않습니다. 그리고'strncpy()'도 프로그래머가 제대로 사용하지 못하게한다. –

0

당신은 .... 포인터가 더 이상 할당 된 동적 메모리를 살펴보고 삭제할 수없는 대신에 "안녕하세요"리터럴 가리키는 때문에 다음 줄의 액세스 위반을 얻을

myString = "Hello"; 
라인은 또한 당신이 원하는 일을하지 않을, 당신은

char myString[32]; 
strcpy(myString,"Hello") 

또는 strncpy 더 나은 봐 ... (이 변화를 삭제/새에 필요는 없습니다)를 사용할 필요가

Google이나 책에 게재됩니다.

또는 당신이 당신이 (http://en.cppreference.com/w/ [표준 : string``] 사용해야하는 이유 좋은 이유는 C++

std::string myString; 
myString = "Hello";