2016-10-31 5 views
0

동적 배열을 사용하여 첫 번째 실제 프로그램을 작성하려고하지만 이해할 수없는 문제가 발생했습니다. 기본적으로 동적 배열을 가져 와서 임시 배열에 복사하고 원래 배열에 주소를 한 개 더 추가 한 다음 모든 배열을 원래 배열에 다시 복사하려고합니다. 이제 원래 배열에는 이전보다 하나 더 많은 주소가 있습니다. 이것은 int로 시도 할 때 완벽하게 작동하지만 문자열로 인해 프로그램이 중단됩니다. 여기에 내가 함께 사투를 벌인거야 코드의 예는 다음과 같습니다새 문자열을 할당하면 충돌이 발생합니까?

void main() 
{ 
int x = 3; 
std::string *q; 
q = new std::string[x]; 

q[0] = "1"; 
q[1] = "2"; 
q[2] = "3"; 

    x++; 
    std::string *temp = q; 
    q = new std::string[x]; 
    q = temp; 
    q[x-1] = "4"; 

    for (int i = 0; i < 5; i++) 
    std::cout << q[i] << std::endl; 
} 

내가 대신 문자열의 int로 포인터로 Q와 임시을한다면 다음 프로그램이 잘 실행됩니다. 어떤 도움이라도 대단히 감사 할 것입니다, 저는 1 시간 또는 2 시간 동안이 일에 매달 렸습니다.

+0

'q = new std :: string [x];와'q = temp;'... '='기호는 두 경우 모두 똑같은 것을 의미합니다. –

답변

1

q = temp은 얕은 복사본 만 수행합니다. 원래 q과 그것이 가리키는 모든 문자열을 잃게됩니다.

는 4 개 요소를 갖는 q를 재 할당되지만 즉시 x의 요소가 현재 배열 범위 밖에 액세스 (및 지정) (단지 3 개의 요소에 할당 된) temp 재 할당하기 때문이다. 어떤 이유로 이런 식으로 할 경우

, 그것은 다음과 같아야합니다

그러나
auto temp = q; 
q = new std::string[x]; 

for(int x = 0; x < 3; ++x) 
    q[x] = temp[x]; 

delete [] temp; 
q[x] = 4; 

이 분명히 더 복잡하고 매우 경향이 일의 관용적 인 방법에 비해 오류 C++에서. 대신 std::vector<std::string>을 사용하는 것이 좋습니다.

+0

좋습니다. 감사 –

관련 문제