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; 
} 

Когда я запускаю этот код, я начинаю входной х и у и сразу после I типа у значения, программа перестает работать. Когда я ввожу только одну строку, программа выполняет отлично, но проблема возникает, когда я хочу ввести более одной строки, ..Program вылетает сразу после выхода первого выхода. Мой полный код с векторами:

#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') ничего не делает с распределением или освобождением, поэтому это чистый шум для вопроса. В качестве бонуса, если вы это сделали, прежде чем публиковать свой вопрос, вы, вероятно, видели бы, что вы 'delete [] array;' внутри вашей петли - таким образом, чтобы вы могли выяснить ошибку перед публикацией. – mah

+0

Связанный код использует 'malloc'. Вы должны использовать 'free' для выпуска в этом случае, а не' delete'. – Mat

ответ

2

Предполагая, что массивы x, y и s быть динамически распределяемых через new[] и n > 1, ваш цикл будет освобождать x, y, 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

Если вам не наделяют ключевое слово «новый» , вам никогда не нужно называть delete. Вы только должны освободить, если вы выделите кучу. Используйте стандартные классы lib, чтобы позволить им делать новый/delete в куче внутри.

+0

Мне бы очень хотелось, но я новичок в C++ .. Мне не очень понятно, что вы только что сказали. – frank17

+0

Мы все были noobs :) Я только на ранней стадии запомнил «новое». Всякий раз, когда он используется, он должен быть сопряжен с удалением. И вы можете почти во всех случаях избегать их использования, используя типы в std :: namespace. Я рекомендую вам прочитать стек против кучи. Это очень полезно знать. – JonPall

Смежные вопросы