Хорошо, поэтому я знаю, что в этом коде есть много ошибок. Я довольно новичок в динамическом распределении памяти, указателях и т. Д.Ошибка сегментации: 11 и ошибки malloc в коде C++
Файл заголовка, account.h, предоставлен нам нашим профессором. Нам сказали не вносить никаких изменений в файл .h.
Файл реализации написан мной. Основная функция включена только для базового начального тестирования. Нам был дан еще один файл, чтобы фактически протестировать реализацию класса учетной записи.
Если я не прокомментирую строку имени cout, я получаю ошибку 11 с ошибкой seg. Если я делаю, это будет печатать номер счета, но бросить эту ошибку:
Test (29976) таНос: * ошибка для объекта 0x62c1aa18c9d8374: указатель освобождения не было выделено * установить контрольную точку в malloc_error_break для отладки
Ловушка прерывания: 6
Любая помощь абсолютно была бы признательна!
Вот заголовок файла:
class account
{
public:
typedef char* string;
static const size_t MAX_NAME_SIZE = 15;
// CONSTRUCTOR
account (char* i_name, size_t i_acnum, size_t i_hsize);
account (const account& ac);
// DESTRUCTOR
~account ();
// MODIFICATION MEMBER FUNCTIONS
void set_name(char* new_name);
void set_account_number(size_t new_acnum);
void set_balance(double new_balance);
void add_history(char* new_history);
// CONSTANT MEMBER FUNCTIONS
char* get_name () const;
size_t get_account_number () const;
double get_balance() const;
size_t get_max_history_size() const;
size_t get_current_history_size () const;
string* get_history() const;
friend ostream& operator <<(ostream& outs, const account& target);
private:
char name[MAX_NAME_SIZE+1]; //name of the account holder
size_t ac_number; //account number
double balance; //current account balance
string *history; //Array to store history of transactions
size_t history_size; //Maximum size of transaction history
size_t history_count; //Current size of transaction history
};
Вот файл реализации:
// File: account.cxx
// Author: Mike Travis
// Last Modified: Mar 3, 2012
// Description: implementation of Account class as prescribed by the file account.h
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include "account.h"
using namespace std;
//Constructor
account::account(char* i_name, size_t i_acnum, size_t i_hsize){
string *d_history;
d_history = new string[i_hsize];
for(int i = 0; i<i_hsize; i++){
name[i] = i_name[i];
}
ac_number = i_acnum;
history_size = i_hsize;
history_count = 0;
}
account::account(const account& ac){
string *d_history;
d_history = new string[ac.history_size];
for(int i=0; i<ac.get_current_history_size(); i++){
strcpy(d_history[i], history[i]);
}
strcpy(name,ac.get_name());
ac_number = ac.get_account_number();
history_size = ac.get_max_history_size();
history_count = ac.get_current_history_size();
}
account::~account(){ delete [] history; }
void account::set_name(char* new_name){ strcpy(name, new_name); }
void account::set_account_number(size_t new_acnum){ ac_number = new_acnum; }
void account::set_balance(double new_balance){ balance = new_balance; }
void account::add_history(char* new_history){
strcpy(history[history_count], new_history);
history_count++;
}
char* account::get_name() const {
char* name_cpy;
strcpy(name_cpy, name);
return name_cpy;
}
size_t account::get_account_number() const{ return ac_number; }
double account::get_balance() const{ return balance; }
size_t account::get_max_history_size() const{ return history_size; }
size_t account::get_current_history_size() const{ return history_count; }
//string* account::get_history() const{ return *history; }
int main(){
account test1("mike travis", 12345, 20);
//cout<<"\nname: "<< test1.get_name();
cout<<"\n\nacnum: "<<test1.get_account_number()<<"\n\n";
return 0;
}
Если вы пишете на C++, вы должны предпочесть 'new' /' 'delete' к malloc' /' free'. И вы должны использовать умные указатели для управления вещами, если вы действительно не знаете, что делаете. –
Ошибка сообщает вам, как отлаживать это: «установите точку останова в malloc_error_break для отладки». Вы это сделали? Что вы обнаружили? –
Если ваш инструктор дал вам этот заголовочный файл, сообщите ему, что он должен выбрать [хорошую книгу на C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) и не научить студентов писать плохой код на C++. Невозможно реализовать этот класс правильно: он владеет ресурсами, но не предоставляет объявленного пользователем оператора назначения копирования. –