2016-01-31 4 views
-1

Я написал программу, которая динамически выделяет память для массива структуры. Кажется, он работает нормально, но когда я пытаюсь удалить массив, компьютер создает шум «bong», и программа перестает отвечать. Он не вызывает ошибку или что-то еще, он просто останавливается. Я пробовал delete и delete[] с тем же результатом. Я попытался переместить местоположение удаления и обнаружил, что могу удалить его сразу после его создания, но не после того, как он был передан любым функциям. Может ли кто-нибудь сказать мне, почему я не могу удалить память?Программа вылетает при удалении динамического массива C++

#include <iostream> 
#include <iomanip> 
#include <fstream> 
using std::cin; 
using std::cout; 
using std::endl; 
using std::ifstream; 
using std::ofstream; 
using std::setw; 
using std::left; 
using std::fixed; 
using std::setprecision; 

//structure of an employee 
struct Employee 
{ 
    char first_name[32]; 
    char last_name[32]; 
    char SSN[11]; 
    float wage; 
    int hours; 
    char status; 
}; 

void ReadData(Employee work_force[]); 
void PrintData(Employee work_force[], int number_entries); 
float CalculateStarightPay(Employee worker); 
float CalculateOvertimePay(Employee worker); 
int FindNumberEntries(); 

const int SPACING = 15;        //spacing used in formating 
const char dataFile[] = "EmployeeData.txt";   //file to read data from 
const int union_dues = 5;       //amount deducted from pay for the union 

int main() 
{ 
    int number_entries = FindNumberEntries(); 
    //array of employees 
    Employee * work_force = new Employee[number_entries]; 

    //read in data 
    ReadData(work_force); 

    //prints the data 
    PrintData(work_force, number_entries); 

    //clean up memory 
    delete[] work_force; 

    return 0; 
} 

//finds the number of entries in the file 
int FindNumberEntries() 
{ 
    int counter = 0; 
    //worker to read through file entries 
    Employee worker_temp; 

    ifstream input; 

    input.open(dataFile); 

    if (input.is_open()) 
    { 
     while (!input.eof()) 
     { 
      input >> 
       worker_temp.first_name >> 
       worker_temp.last_name >> 
       worker_temp.SSN >> 
       worker_temp.wage >> 
       worker_temp.hours >> 
       worker_temp.status; 

      cin.clear(); 

      counter++; 
     } 

     input.close(); 
    } 
    else 
    { 
     cout << "File could not be opened!" << endl; 
    } 

     return counter - 1; 
} 

//reads employee data from file 
void ReadData(Employee work_force[]) 
{ 
    ifstream input; 

    input.open(dataFile); 

    //reads in entries 
    if (input.is_open()) 
    { 
     for (int i = 0; !input.eof(); i++) 
     { 
      //reads in employee data 
      input >> 
       work_force[i].first_name >> 
       work_force[i].last_name >> 
       work_force[i].SSN >> 
       work_force[i].wage >> 
       work_force[i].hours >> 
       work_force[i].status; 

      cin.clear(); 
     } 

     input.close(); 
    } 
    else 
    { 
     //error that file could not open 
     cout << "File could not be opened!" << endl; 
    } 

} 

//calculates straight pay 
float CalculateStarightPay(Employee worker) 
{ 
    //determines of worker is fulltime or not 
    if (worker.status == 'F') 
    { 
     if (worker.hours > 40) 
     { 
      return ((worker.wage * 40) - 5); 
     } 
     else 
     { 
      return (worker.wage * worker.hours) - union_dues; 
     } 
    } 
    else 
    { 
     if (worker.hours > 40) 
     { 
      return (worker.wage * 40); 
     } 
     else 
     { 
      return worker.wage * worker.hours; 
     } 
    } 
} 

//calculate overtime pay 
float CalculateOvertimePay(Employee worker) 
{ 
    //deermines if there are any overtime hours 
    if (worker.hours <= 40) 
    { 
     return 0; 
    } 
    else 
    { 
     //calculates overtime pay 
     return ((worker.hours - 40) * (worker.wage * 1.5)); 
    } 
} 

//prints employee data in a well formated manner 
void PrintData(Employee work_force[], int number_entries) 
{ 
    delete work_force; 
    float straight_pay = 0.0F; 
    float Overtime_pay = 0.0F; 
    char name[32] = { '\0' }; 

    //print headers 
    cout << left << 
     setw(SPACING) << "Name" << 
     setw(SPACING) << "SSN" << 
     setw(SPACING) << "Hourly Wage" << 
     setw(SPACING) << "Hours Worked" << 
     setw(SPACING) << "Straight Pay" << 
     setw(SPACING) << "Overtime Pay" << 
     setw(SPACING) << "Status" << 
     setw(SPACING) << "Net Pay" << endl; 

    //prints data for each EMPLOYEE 
    for (int i = 0; i < number_entries; i++) 
    { 
     straight_pay = CalculateStarightPay(work_force[i]); 
     Overtime_pay = CalculateOvertimePay(work_force[i]); 
     //adds a space after first name 
     work_force[i].first_name[strlen(work_force[i].first_name) + 1] = '\0'; 
     work_force[i].first_name[strlen(work_force[i].first_name)] = ' '; 
     //puts last name and first name together 
     strcpy(name, strcat(work_force[i].first_name, work_force[i].last_name)); 

     //prints out all the data in a nic eformat 
     cout << fixed << setprecision(2) << 
      setw(SPACING) << name << 
      setw(SPACING) << work_force[i].SSN << '$' << 
      setw(SPACING) << work_force[i].wage << 
      setw(SPACING) << work_force[i].hours << '$' << 
      setw(SPACING) << straight_pay << '$' << 
      setw(SPACING) << Overtime_pay << 
      setw(SPACING) << work_force[i].status << '$' << 
      setw(SPACING) << (straight_pay + Overtime_pay) << endl; 
    } 
} 
+0

Вы делаете это неправильно 'а' ('cin.clear();' бесполезно) –

+3

Но ... почему (input.eof (!)) вы бы «удалили» что-то в функции с именем «PrintData» ??? После этого вы даже выполняете 'work_force [i]'. – LogicStuff

+1

Это шутка/спам? 'delete work_force;' в 'PrintData'! Никто не сделал бы это по ошибке .... – 4386427

ответ

1
  1. Не delete work_force; в верхней части PrintData.

  2. Используйте std::string s для ваших имен и SSN. (Строки с фиксированной длиной - это случайность использования, которая должна произойти).

  3. Использовать std::vector<Employee>. Важно то, что это означает, что вам больше не нужно использовать new (это то, что вы всегда должны стараться избегать). Это также означает, что вам нужно только прочитать файл один раз - вы просто прочитали запись, а затем надавите на вектор с помощью push_back.

  4. При чтении из входного потока вам нужно попробовать прочитать , а затем протестировать поток, чтобы узнать, попали ли вы в eof. Таким образом, функция чтения будет выглядеть так:

    while (input >> 
         worker_temp.first_name >> 
         worker_temp.last_name >> 
         worker_temp.SSN >> 
         worker_temp.wage >> 
         worker_temp.hours >> 
         worker_temp.status) 
        { 
         workforce.push_back(worker_temp); 
        } 
    
Смежные вопросы