2011-03-27 5 views
0

새 MyString 개체가 만들어지면 프로그램이 즉시 중단됩니다.처리되지 않은 예외 오류, 메모리 위반

stringArray [0]이 생성자에서 null char로 설정되면 메모리 액세스 위반이 발생합니다. 어떤 아이디어? 클래스 전용 부재

여기
char* stringArray; 
int stringCap; 
int stringSize; 

은 여기

생성자 여기

MyString::MyString() 
{ 
    stringSize = 0; 
    stringCap = 16; 
    stringArray[stringCap + 1]; 
    stringArray[0] = '\0'; 
} 

이다 개체 MAIN.CPP에서 생성되는 곳이 광고가 수행

MyString s1; 

답변

1

메모리를 할당하지 않음 :

stringArray = new char[stringCap + 1]; 

메모리를 삭제하는 것을 잊지 마세요 :
stringArray[stringCap + 1]; 

당신은 그것을 교체해야합니다.

또한 규칙 3은 개체가 소유 한 RAW 메모리를 갖고 있기 때문에 여기에 적용됩니다.

동적 할당을 원하지 않고 고정 된 크기의 문자열을 원한다면. 문 위

char stringArray[ <FixedSizeHere> ]; 
+0

실제로. Martin의 말에 덧붙이면 클래스의 소멸자는 할당 된 메모리를 해제해야하는 곳입니다. }' – karlphillip

+0

대단한 도움, 고마워요. – bluetickk

+0

@bluetickk 답변을 검토하고 문제를 해결 한 것이 중요합니다. – karlphillip

0
char* stringArray; 

말한다 stringArray 문자 (들)에 대한 포인터입니다 : 그럼 당신은 당신의 멤버의 선언을 변경할 수 있습니다. 따라서 문자 위치의 주소를 보유해야합니다.

stringArray[stringCap + 1]; 

은 여기 액세스 문자의 배열을 가리키는 stringArray 것처럼 인덱스 stringCap+1에있는 문자로 노력하고 있습니다. 그러나 stringArray에는 문자의 주소 위치가 없습니다. 따라서 메모리 액세스 위반의 오류입니다.

크기가 stringCap+1 인 배열을 만들려는 의도가 잘못된 경우에도 마찬가지입니다.

stringArray[stringCap + 1]; 
      //^^^^^^^^^^^^^ size of the array should be compile time constant. 
      // i.e., integer literal, or a #defined constant or const int 

것 같다

이 프로그램은 크기 17의 문자 배열을 만들기 위해 노력하고있다. 그래서 클래스 선언에서 그렇게 할 수 있습니다 -

class MyString 
{ 
    stringArray[17] ; 
    // ..... 
}; 
관련 문제