2014-02-09 3 views
-1

이 출력으로 인해 프로그램이 작동을 멈 춥니 다. 어떻게 할당을 해제 할 수 있습니까? 나는 내 코드에서 가지고있는 것을 시도했지만 그것은 도움이되지 않는다. 전체 코드는 여기에서 찾을 수 있습니다 :이 코드를 실행하면 full code배열 메모리를 어떻게 할당 해제 할 수 있습니까?

for (i = 0 ; i < n ; i++) { 
    if (
     !((x[i] >= 0) && (x[i] <= a) & 
      (y[i] >= 0) && (y[i] <= b) 
     ) 
    ) { 
     cout << x[i] << ' ' << y[i] << ' ' << s[i] << ' ' << "SPADOL" << endl; 
    } else { 
     cout << x[i] << ' ' << y[i] << ' ' << s[i] << endl; 
    } // ALLOCATION IS DONE AT THIS POINT 

    delete [] x; 
    delete [] y; 
    delete [] s; 
} 

, 내가 입력 x와 y를 시작하고 내가 y 값을 입력 한 직후, 프로그램이 작동을 멈 춥니 다. 한 행만 입력하면 프로그램이 완벽하게 실행되지만 두 개 이상의 행을 입력하려고 할 때 문제가 발생합니다 .. 첫 번째 출력이 인쇄 된 직후 프로그램이 충돌합니다. 벡터와 내 전체 코드 : x, ys 동적 new[]n > 1를 통해 할당 할 수있는 배열을 가정

#include <iostream> 
#include <string> 
#include <vector> 
#include <stdlib.h> 
#include <string> 

using namespace std; 
// vector<string> inputs; 
int n; // pocet uloh 
int a; // rozmer obdlznika a 
int b; // rozmer obdlznika b 
vector<int> x; 
vector<int> y; 
vector<string> s; 
int i; 
int d; 

static const char alpha[] = {'D', 'L', 'P'}; 
char genRandom() 
{ 
    return alpha[rand() % strlen(alpha)]; 
} 
// end of generator 


int main() { 

    cin >> n; 

    while(!((n >= 1)&&(n <=15000))) 
    { 
      cout << "max 15000" << flush; 
      cin >> n; 
      } 


    cin >> a >> b; 

    while(!((a >= 1)&&(a <=100) & (b >= 1)&&(b <= 100)&&(a!=b))) 
    { 
      cout << "chyba max 100 alebo a!=b" << endl; 
      cin >> a >> b; 
      } 


     for (i = 0; i < n; i++) 
       {  
        cout << "Uloha " << i+1 << ":" << endl; 

        cin >> x[i]; 
        cin >> y[i]; 
        cin >> s[i]; 

        while(!((x[i]>=0)&&(x[i]<=a))) { 
        cout << "Try Again x: " << flush; 
        cin >> x[i];} 
        while(!((y[i]>=0)&&(y[i]<=b))) { 
        cout << "Try Again y: " << flush; 
        cin >> y[i];} 


        if (s[i] == "S"){ 
          y[i] = (y[i]+1); 
          }else if (s[i] == "J"){ 
           y[i] = (y[i]-1); 
           }else if (s[i] == "V"){ 
             x[i] = (x[i]+1); 
             }else if (s[i] == "Z"){ 
              x[i] = (x[i]-1); 
              } 
        cin >> d; 
        while(!((d>=1)&& (d<=200))) { 
        cout << "Try Again d: " << flush; 
        cin >> d;} 


        for (int counter=0; counter<d; counter++) 
        { 
        cout << genRandom(); 
        } 
        cout << endl; 

      } // koniec for 

      for (i = 0 ; i < n ; i++) 
            { 
             if(!(((x[i]>=0)&&(x[i]<=a)) | ((y[i]>=0)&&(y[i]<=b)))){ 
                cout << x[i] << ' ' << y[i] << ' ' << s[i] << ' ' << "SPADOL" << endl; 
                }else{ 
                cout << x[i] << ' ' << y[i] << ' ' << s[i] << endl; 

                } 

            } 




system("pause"); 

} 
+3

전체 코드가 표시되지 않습니다 ... 할당이 완료된 곳은 어디입니까? –

+1

문제를 표시하는 코드를 제공하는 경우 오류를 생성하는 데 필요한 모든 코드를 포함하고 오류와 관련없는 코드는 제거하십시오. 예를 들어, 여러분이 제공 한 대부분의 코드 (전체'if' /'else' 블록)는 할당이나 할당 해제에 아무런 영향을주지 않으므로 질문에 대한 순수한 소음입니다. 보너스로, 질문을 게시하기 전에 그렇게했다면 루프 내부에서'[array [; array];를 보았을 것입니다. 따라서 게시하기 전에 실수를 알아낼 수 있습니다. – mah

+0

링크 된 코드는'malloc'을 사용합니다. 이 경우에는'free'를 사용하여'delete'를하지 말아야합니다. – Mat

답변

2

은, 루프 주위, xy, s 처음 할당을 해제합니다 다음에 시도합니다 다음 반복을 x[i] 읽으십시오.

당신은 루프의 delete[] 외부를 이동해야합니다, 또는 더 나은, 당신은 std::vector처럼 자동적으로 자신을 정리 컨테이너를 사용해야합니다

std::vector<int> x; 
std::vector<int> y; 
std::vector<int> s; 

for (i = 0 ; i < n ; i++) { 
    if (
     !((x[i] >= 0) && (x[i] <= a) & 
      (y[i] >= 0) && (y[i] <= b) 
     ) 
    ) { 
     cout << x[i] << ' ' << y[i] << ' ' << s[i] << ' ' << "SPADOL" << endl; 
    } else { 
     cout << x[i] << ' ' << y[i] << ' ' << s[i] << endl; 
    } 
} 
+0

마법을 정리하려면 : 벡터는 스택에 할당되며, 요소는 힙에 할당됩니다. 그래서 내부적으로 할당과 할당 해제를 추적합니다. – JonPall

+0

코드에서 보여준 것처럼 작동하지만 작동하지 않는 벡터를 사용하려고했습니다. 뭔가 빠졌을 수 있습니다. – frank17

+0

@ferii, 벡터를 초기화해야합니다. – Shoe

1

당신이 키워드 "새"로 할당하지는 경우 , 삭제를 호출 할 필요가 없습니다. 힙에 할당하는 경우에만 할당을 해제해야합니다. 표준 lib 클래스를 사용하여 내부적으로 힙에 대한 새/삭제 작업을 수행 할 수 있습니다.

+0

나는 C++에서 초보자를 원합니다. 당신이 방금 말한 것을 나에게 분명히 밝히지는 않습니다. – frank17

+0

우리는 모든 멍청한 놈들 이었어. 나는 일찍부터 "새로운"것에 대한 정신적 인 언급을했다. 사용할 때마다 삭제와 쌍을 이루어야합니다. 그리고 거의 모든 경우에 std :: namespace의 형식을 사용하여 사용하지 않아도됩니다. 나는 스택 대 힙을 읽을 것을 권한다. 알고 있으면 매우 유용합니다. – JonPall

관련 문제