Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 14:32   #1
Purr
Пользователь
 
Аватар для Purr
 
Регистрация: 18.05.2010
Сообщений: 21
Печаль Неправильно выделена память. С++

Задача с перегрузками. Память вроде бы везде освобождаю правильно, и соответственно удаляю, но компилятор постоянно ругается. Я уже не знаю, что думать... Помогите, пожалуйста((

Вот текст программы

Код:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include<iomanip.h>

const int M=7, N=5;
int f;

class TGruz
{
float a, b;
double st_mas[M];
int *p;

public:
TGruz(float aa=0, float bb=0, double sm=0, int pp=0);
TGruz::~TGruz();
void vvod();
void vivod();

TGruz& operator =(TGruz&obj);
TGruz operator +(TGruz&obj);
friend int operator && (TGruz&x, TGruz&y);
TGruz& operator -=(TGruz&obj);
};

TGruz::TGruz (float aa, float bb, double sm, int pp)
	{
	a=aa;
	b=bb;
	for (int i=0; i<M; i++)
	st_mas[i]=sm;
	p=new int;
	*p=pp;
	}

TGruz::~TGruz()
{delete p;}

void TGruz::vvod()
	{
	cout << "Vvedite chislo" << endl;
	cin >>a;
	cout << "Vvedite chislo 2" << endl;
	cin >>b;
	cout << "Vvedite ykazatel" << endl;
	cin >> *p;
	for(int i=0; i<M; i++)
	 {
	 cout << "Vvedite el-t massiva" << endl;
	 cin >> st_mas[i];
	 }
	}

void TGruz::vivod()
	{
	if (f==0) cout<<"Klass raven 0"<<endl;
	else
	{
        cout << endl;
	cout << "Chislo 1: " <<a<<endl;
	cout << "Chislo 2: " <<b<<endl;
	cout << "Ykazatel: " <<*p<<endl;
	for (int i=0; i<M; i++) cout<<" "<<st_mas[i];
	cout<<endl;
	}
	f=1;
	}
TGruz&TGruz::operator =(TGruz&obj)
{
a=obj.a; b=obj.b;
*p=*obj.p;
for (int i=0; i<M; i++)
	st_mas[i]=obj.st_mas[i];
return *this;
}

TGruz TGruz::operator +(TGruz&obj)
{
TGruz tmp;
tmp.a=a+obj.a;
tmp.b=b+obj.b;
*tmp.p=*p+*obj.p;
for (int i=0; i<M; i++)
	tmp.st_mas[i]= st_mas[i]+obj.st_mas[i];
return tmp;
}

int operator && (TGruz&x, TGruz&y)
{
if(x.a==0 && x.b==0 && x.p==0 && x.st_mas==0 && y.a==0 && y.b==0 && y.p==0 && y.st_mas==0)
f=0;
else
f=1;
return f;
}


TGruz& TGruz::operator -=(TGruz&obj)
{
a-=obj.a;
b-=obj.b;
*p-=*obj.p;
for (int i=0;i<M;i++)
	st_mas[i]-=obj.st_mas[i];
return *this;
}

void main()
{
clrscr();
TGruz a, b, c, d, *k;
k=new TGruz;
cout <<"Object a"<< endl; a.vvod(); cout << endl;//
cout <<"Object b"<< endl; b.vvod(); cout << endl; //b.vivod();
cout <<"Object c"<< endl; c.vvod(); cout << endl; //c.vivod();
cout <<"Object d"<< endl; d.vvod(); cout << endl; //d.vivod();
cout <<"Ykazat k"<< endl; k->vvod(); cout << endl; //k->vivod();

cout <<"Object a="<< endl; a.vivod(); cout <<endl;

cout <<"c=a";
c=a;
cout <<"Object c="<< endl; c.vivod(); cout <<endl;
getch();
cout <<"c=a=b";
c=a=b;
cout <<"Object a="<< endl; a.vivod(); cout <<endl;
cout <<"Object b="<< endl; b.vivod(); cout <<endl;
cout <<"Object c="<< endl; c.vivod(); cout <<endl;
getch();
cout <<"---------------------------------"<< endl;

cout <<"Operator +. b=b+b"<<endl;
b=b+b;
cout <<"Object b="<< endl; b.vivod(); cout <<endl;
cout <<"a=b+c"<<endl;
a=b+c;
cout <<"Object a=" << endl; a.vivod(); cout <<endl;
getch();
cout <<"---------------------------------"<< endl;

cout <<"Operator &&. a&&b" << endl;
a&&amp;b;
cout <<"Object a=" << endl; a.vivod(); cout <<endl;
cout <<"Object b="<< endl; b.vivod(); cout <<endl;
cout <<"c&&d" << endl;
c&&amp;d;
cout <<"Object c="<< endl; c.vivod(); cout <<endl;
cout <<"Object d="<< endl; d.vivod(); cout <<endl;
cout <<"a&&d" << endl;
a&&amp;d;
getch();
cout <<"---------------------------------"<< endl;

cout <<"Operator -=. a-=b" << endl;
a-=b;
cout <<"Object a teper = "<< endl; a.vivod(); cout <<endl;
cout <<"b-=c" << endl;
b-=c;
cout <<"Object b teper = "<< endl; b.vivod(); cout <<endl;
cout <<"Razmer ykazatela k-=2" << endl;
cout <<"Razmer ykazatela k=" << sizeof(k) <<endl;
cout <<"---------------------------------"<< endl;
getch();

TGruz st_mas[M];
	for(int i=0;i<N;i++)
	{
	cout<<"mas["<<i<<"].  ";
	st_mas[i].vivod();
	cout<<endl;
	}
cout << "Press any key" << endl;

getch();
delete k;
}
— Марвин, ты спас нам жизнь!
— Кошмар, правда?
(с) The Hitchhiker's Guide to the Galaxy

Последний раз редактировалось Purr; 31.10.2010 в 20:13.
Purr вне форума Ответить с цитированием
Старый 31.10.2010, 14:43   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
p=new int;
это что такое??? Не нужно!!!

Цитата:
delete k;
лучше сначала проверить, а не пустой ли указатель
Код:
if (k)
  delete k;
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 31.10.2010, 14:44   #3
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

и желательно выложить бы лог билда
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 31.10.2010, 15:14   #4
Purr
Пользователь
 
Аватар для Purr
 
Регистрация: 18.05.2010
Сообщений: 21
По умолчанию

лог билда? стыдно, но не поняла....( ща исправлю, посмотрю...
— Марвин, ты спас нам жизнь!
— Кошмар, правда?
(с) The Hitchhiker's Guide to the Galaxy
Purr вне форума Ответить с цитированием
Старый 31.10.2010, 15:21   #5
Purr
Пользователь
 
Аватар для Purr
 
Регистрация: 18.05.2010
Сообщений: 21
По умолчанию

если память не выделять под указатель, там вообще белиберда получается... он в результатах мне при складывании объектов выдает числа непонятные, с экспонентами и т.д..
с указателем k сделала так, как написал..
но память все равно неправильно выделена
— Марвин, ты спас нам жизнь!
— Кошмар, правда?
(с) The Hitchhiker's Guide to the Galaxy
Purr вне форума Ответить с цитированием
Старый 31.10.2010, 19:10   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

у тя есть ася? давай там пообщаемся, помогу
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 31.10.2010, 19:13   #7
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
a=a;
а смысл в чем?

Цитата:
int *p;
для чего нужен указатель? пчму не просто переменная, а именно указатель

класс вообще лучше выделить в отдельный файл + заголовочный
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 31.10.2010, 20:05   #8
Purr
Пользователь
 
Аватар для Purr
 
Регистрация: 18.05.2010
Сообщений: 21
По умолчанию

указатель задан по заданию...
— Марвин, ты спас нам жизнь!
— Кошмар, правда?
(с) The Hitchhiker's Guide to the Galaxy
Purr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
Че неправильно! HixoH Общие вопросы C/C++ 0 23.12.2009 15:04
что неправильно? helavisa Общие вопросы C/C++ 18 02.06.2009 17:51
Скрипт неправильно работает aleksa76 JavaScript, Ajax 4 21.05.2008 17:47
неправильно выдаёт stringgrid chelsi Общие вопросы Delphi 3 30.04.2008 22:42