Консультация № 109791
17.11.2007, 07:05
0.00 руб.
0 3 2
Здравствуйте, эксперты!
Как исправить следующую программу (по возможности только конструктор копии и деструктор), чтобы деструктор освобождал память.
Нужно сделать так чтобы память очищалась в классе, а не int main() программе.

Приложение:
const int max_size = 100; char longsumch(char a, char b) { return (int) a + (int) b - ‘0‘; } class Long { char *a; public: Long() { a = new char[max_size]; strcpy(a, ""); } Long(char *s) { a = new char[max_size]; a = s; } Long(const Long &ob) { a = ob.a; // возможно нужно исправить конструктор копии } ~Long() { delete []a; cout << "delete []a"; } char *get() { return a; } Long operator + (Long &op2); }; Long Long :: operator + (Long &op2) { Long temp; temp.a = "7\\0"; // "сумма" двух чисел return temp; }int main(){ Long x("4"), y("3"), z; z = x + y; // вот здесь после возврата значения (x+y) // память занимаемая (x+y) должна очиститься cout << z.get(); getch();return 0;}

Обсуждение

Неизвестный
17.11.2007, 12:50
общий
это ответ
Здравствуйте, Tito!

Страшные вещи у вас происходят... особенно в Long::Long(const Long &ob), Long :: operator + (Long &op2)

Советую почитать в книге Страуструпа "Язык С++" про реализацию класса String и всё встанет на свои места.
Неизвестный
17.11.2007, 13:16
общий
это ответ
Здравствуйте, Tito!
Как я понял вам надо удалить содержимое объектов х и y до завершения программы! тогда деструтктор вам не полдходит потомучто деструктор вызываеться только в конце тела! вам нужно создать две функции удаления памяти и резервирования!
И вообще у вас очень много ошибок! вызабыли перегрузить оператор =, и много другого!
См приложения! Я переделал вашу програму!
Удачи!
Разбирайте и спрашивайте что не понятно!

Приложение:
#include "iostream.h"//using namespace std;const int max_size = 100; /* char longsumch(char a, char b) { return (int) a + (int) b - \‘0\‘; }*/ class Long { char *a; public: Long() { a = new char[max_size]; strcpy(a, ""); } Long(char *s) { a = new char[max_size]; strcpy(a,s); } Long(Long &ob) { a = new char[max_size]; strcpy(a,ob.a); // возможно нужно исправить конструктор копии } ~Long() { if(a!=NULL) delete []a; cout << "delete []a\n"; } char *get() { return a; } Long operator+ (Long op2); Long operator=(Long op2);//нужно перегрузить оператор равно void FreeMem(void){delete []a; a=NULL;}//освобождения памяти void CreateMem(int Size) {a=new char[Size];}//резервирования памяти }; Long Long::operator + (Long op2) { Long temp; int iop =atoi(op2.get()); int i=atoi(a); itoa((i+iop),temp.a,10); // "сумма" двух чисел return temp; } Long Long::operator =(Long op2) { strcpy(a,op2.get()); return *this; }int main(){ Long x("4"), y("3"), z; z = x + y; // вот здесь после возврата значения (x+y) // память занимаемая (x+y) должна очиститься x.FreeMem(); y.FreeMem(); cout << z.get(); //getch(); cin.get();return 0;}
Неизвестный
18.11.2007, 08:43
общий
Благодарю CruelHity.И ещё вопрос.Зачем перегружать оператор = Создается же побитовя копия возвращяемого результата.Так что без него всё работает, можешь сам проверить.
Форма ответа