Форум программистов, компьютерный форум CyberForum.ru

Выделение и освобождение памяти в конструкторе и деструкторе - C++

Восстановить пароль Регистрация
 
nzk
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 7
18.02.2013, 17:57     Выделение и освобождение памяти в конструкторе и деструкторе #1
Есть программа с классом содержащим обьекты векторы. Однако по кончанию программы выбивате ошибку _block_type_is_vali(phead->nblockuse). Ясно что проблема с освобождением памяти но как ее иправитья я не знаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <math.h>
using namespace std;
class vectors
{
public:float x1,y1,z1;
       float x2,y2,z2;
       float a1,b1,c1;
       float a2,b2,c2;
       float c,d1,d2,m;
    float vvod1()
    {
    cout<<"Введите координаты первого вектора\n";
    cin>>x1;cin>>y1;cin>>z1;
    return x1,y1,z1;
    }
    float vvod2()
    {
    cout<<"Введите координаты второго вектора\n";
    cin>>x2;cin>>y2;cin>>z2;
    return x2,y2,z2;
    }
    float sum(float p1,float p2,float p3)
    {
    a1=x1+p1;b1=y1+p2;c1=z1+p3;
    cout<<"Сумма векторов\n"<<a1<<" "<<b1<<" "<<c1<<"\n";
    return 0;
    }
    float raz(float p1,float p2,float p3)
    {
    a2=x1-p1;b2=y1-p2;c2=z1-p3;
    cout<<"Разность векторов\n"<<a2<<" "<<b2<<" "<<c2<<"\n";
    return 0;
    }
    float dlina1()
    {
    d1=sqrt(x1*x1+y1*y1+z1*z1);
    cout<<"Длина первого вектора\n"<<d1<<"\n";
    return d1;
    }
    float dlina2()
    {
    d2=sqrt(x2*x2+y2*y2+z2*z2);
    cout<<"Длина второго\n"<<d2<<"\n";
    return d2;
    }
    float cos(float p1,float p2,float p3)
    {
    c=(x1*p1+y1*p2+z1*p3)/(sqrt(x1*x1+y1*y1+z1*z1)*sqrt(p1*p1+p2*p2+p3*p3));
    cout<<"Косинус между векторами\n"<<c<<"\n";
    return c;
    }
    float scal(float p1,float p2,float p3)
    {
    m=sqrt(x1*x1+y1*y1+z1*z1)*sqrt(p1*p1+p2*p2+p3*p3)*c;
    cout<<"Скалярное произведение векторов\n"<<m<<"\n";
    return m;
    }
    float u1(){return x1;}float u2(){return y1;}float u3(){return z1;}
    float t1(){return x2;}float t2(){return y2;}float t3(){return z2;}
    vectors()
    {
    cout<<"Работает конструктор"<<"\n\n";
    float *x1=new float;
    float *y1=new float;
    float *z1=new float;
    }
    
    ~vectors()
    {
    cout<<"Работает деструктор "<<"\n\n";
    if (x1!=NULL)delete &x1;
    if (y1!=NULL)delete &y1;
    if (z1!=NULL)delete &z1;
    }
};
int main()
{
setlocale(LC_ALL,"Russian");
vectors v1,v2;
v1.vvod1();v2.vvod2();
v1.sum(v2.t1(),v2.t2(),v2.t3());v1.raz(v2.t1(),v2.t2(),v2.t3());
v1.dlina1();v2.dlina2();
v1.cos(v2.t1(),v2.t2(),v2.t3());v1.scal(v2.t1(),v2.t2(),v2.t3());
system ("PAUSE");
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2013, 17:57     Выделение и освобождение памяти в конструкторе и деструкторе
Посмотрите здесь:

выделение и освобождение памяти C++
C++ выделение памяти и никогда не выполняете* ее освобождение
C++ Выделение и освобождение памяти в c++
Освобождение и выделение памяти C++
C++ Выделение и освобождение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,904
Записей в блоге: 2
Завершенные тесты: 1
18.02.2013, 18:34     Выделение и освобождение памяти в конструкторе и деструкторе #2
Цитата Сообщение от nzk Посмотреть сообщение
if (x1!=NULL)delete &x1;
а ничего, что x1 не выделялся в куче?
C++
1
float x1,y1,z1;

Не по теме:

Цитата Сообщение от nzk Посмотреть сообщение
C++
1
return x1,y1,z1;
страшная конструкция, однако. Надеюсь, Вы понимаете суть оператора запятая.



Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
    vectors()
    {
    cout<<"Работает конструктор"<<"\n\n";
    float *x1=new float;
    float *y1=new float;
    float *z1=new float;
    }
Работает, работает. просто утечка памяти сразу и всё - на более этот конструктор не тянет
nzk
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 7
18.02.2013, 22:48  [ТС]     Выделение и освобождение памяти в конструкторе и деструкторе #3
Работает, работает. просто утечка памяти сразу и всё - на более этот конструктор не тянет
Так я и спрашиваю, как исправить, чтобы все нормально работало?

Не по теме:

страшная конструкция, однако. Надеюсь, Вы понимаете суть оператора запятая.
Я недавно начал изучать С++. Это совсем неправильно? Просто программа запустилась вот я и оставил как есть.

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.02.2013, 14:21     Выделение и освобождение памяти в конструкторе и деструкторе #4
Цитата Сообщение от nzk Посмотреть сообщение
Это совсем неправильно?
Это правильно с точки зрения компилятора, но не делает того, что вы предполагали - не возвращает из функции 3 значения. В С++ из функции можно вернуть только одно значение.
Цитата Сообщение от nzk Посмотреть сообщение
Так я и спрашиваю, как исправить, чтобы все нормально работало?
У вас в классе объявлены соответствующие поля. Указатель на выделенную память нужно присваивать им, а не локальным переменным, объявленным в теле конструктора.
-=ЮрА=-
Заблокирован
Автор FAQ
22.02.2013, 14:33     Выделение и освобождение памяти в конструкторе и деструкторе #5
nzk,
Цитата Сообщение от nzk Посмотреть сообщение
Так я и спрашиваю, как исправить, чтобы все нормально работало?
вот так исправь http://codepad.org/kO4COPpz
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <cmath>
#include <iostream>
using namespace std;
 
class vectors
{
public:
    float x1,y1,z1;
    float x2,y2,z2;
    float a1,b1,c1;
    float a2,b2,c2;
    float c,d1,d2,m;
    float vvod1()
    {
    cout<<"Ââåäèòå êîîðäèГ*Г*ГІГ» ïåðâîãî âåêòîðГ*\n";
    cin>>x1;cin>>y1;cin>>z1;
    return x1,y1,z1;
    }
    float vvod2()
    {
    cout<<"Ââåäèòå êîîðäèГ*Г*ГІГ» âòîðîãî âåêòîðГ*\n";
    cin>>x2;cin>>y2;cin>>z2;
    return x2,y2,z2;
    }
    float sum(float p1,float p2,float p3)
    {
    a1=x1+p1;b1=y1+p2;c1=z1+p3;
    cout<<"ÑóììГ* âåêòîðîâ\n"<<a1<<" "<<b1<<" "<<c1<<"\n";
    return 0;
    }
    float raz(float p1,float p2,float p3)
    {
    a2=x1-p1;b2=y1-p2;c2=z1-p3;
    cout<<"ГђГ*Г§Г*îñòü âåêòîðîâ\n"<<a2<<" "<<b2<<" "<<c2<<"\n";
    return 0;
    }
    float dlina1()
    {
    d1=sqrt(x1*x1+y1*y1+z1*z1);
    cout<<"ÄëèГ*Г* ïåðâîãî âåêòîðГ*\n"<<d1<<"\n";
    return d1;
    }
    float dlina2()
    {
    d2=sqrt(x2*x2+y2*y2+z2*z2);
    cout<<"ÄëèГ*Г* âòîðîãî\n"<<d2<<"\n";
    return d2;
    }
    float cos(float p1,float p2,float p3)
    {
    c=(x1*p1+y1*p2+z1*p3)/(sqrt(x1*x1+y1*y1+z1*z1)*sqrt(p1*p1+p2*p2+p3*p3));
    cout<<"ÊîñèГ*ГіГ± ìåæäó âåêòîðГ*ìè\n"<<c<<"\n";
    return c;
    }
    float scal(float p1,float p2,float p3)
    {
    m=sqrt(x1*x1+y1*y1+z1*z1)*sqrt(p1*p1+p2*p2+p3*p3)*c;
    cout<<"ÑêГ*ëÿðГ*îå ïðîèçâåäåГ*ГЁГҐ âåêòîðîâ\n"<<m<<"\n";
    return m;
    }
    float u1(){return x1;}float u2(){return y1;}float u3(){return z1;}
    float t1(){return x2;}float t2(){return y2;}float t3(){return z2;}
    vectors()
    {
    cout<<"ГђГ*áîòГ*ГҐГІ ГЄГ®Г*ñòðóêòîð"<<"\n\n";
    //ÈÇÚßÒÜ
    //float *x1=new float;
    //float *y1=new float;
    //float *z1=new float;
    }
    
    ~vectors()
    {
    cout<<"ГђГ*áîòГ*ГҐГІ äåñòðóêòîð "<<"\n\n";
    //ÈÇÚßÒÜ
    //if (x1!=NULL)delete &x1;
    //if (y1!=NULL)delete &y1;
    //if (z1!=NULL)delete &z1;
    }
};
int main()
{
    system("chcp 1251");
    vectors v1,v2;
    v1.vvod1();v2.vvod2();
    v1.sum(v2.t1(),v2.t2(),v2.t3());
    v1.raz(v2.t1(),v2.t2(),v2.t3());
    v1.dlina1();v2.dlina2();
    v1.cos(v2.t1(),v2.t2(),v2.t3());
    v1.scal(v2.t1(),v2.t2(),v2.t3());
    system ("pause");
    return 0;
}
Миниатюры
Выделение и освобождение памяти в конструкторе и деструкторе  
-=ЮрА=-
Заблокирован
Автор FAQ
22.02.2013, 14:40     Выделение и освобождение памяти в конструкторе и деструкторе #6

Не по теме:

silent_1991, зачем в данном задании вообще выделять память?



Добавлено через 5 минут
PS: nzk, я не исправлял return от vvod, но знай что возвратом всегда будет z1, сразу 3 переменных ретюрном не вернёшь(да и смысла не вижу возвращать значения в данном методе).
Метод ввода делается с возвращаемым типом либо void либо bool
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
float vvod1()
* * {
* * cout<<"Введите координаты первого вектора\n";
* * cin>>x1;cin>>y1;cin>>z1;
* * return x1,y1,z1;
* * }
При void мы просто осуществляем ввод, а с bool можем вернуть флаг успешного ввода
C++
1
2
3
4
5
6
bool vvod
{ 
cout<<"Введите координаты первого вектора\n";
cin>>x1;cin>>y1;cin>>z1;
return cin.good();
}
silent_1991
22.02.2013, 14:56
  #7

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
зачем в данном задании вообще выделять память?
Понятия не имею

-=ЮрА=-
Заблокирован
Автор FAQ
22.02.2013, 15:19     Выделение и освобождение памяти в конструкторе и деструкторе #8
nzk, ниже я попытался развить твой код до более-менее приемлимого класса (опять же дорабатывать можно ещё, но хотя бы понятие о принципе построения код дать тебе должен)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <cmath>
#include <iostream>
using namespace std;
 
class algvector
{
private:
    double x,y,z;
public :
    
    algvector()
    {
        cout<<"ГђГ*áîòГ*ГҐГІ ГЄГ®Г*ñòðóêòîð"<<endl;
        x = y = z = 0;
    }
    
    ~algvector()
    {
        cout<<"ГђГ*áîòГ*ГҐГІ äåñòðóêòîð "<<endl;
    }
    double GetX(){return x;}
    double GetY(){return y;}
    double GetZ(){return z;}
    bool vvod(const char * msg);
    void sum
    (
        double p1, double p2, double p3, 
        double &a, double &b, double &c
    );
    void raz
    (
        double p1, double p2, double p3, 
        double &a, double &b, double &c
    );
    double dlina();
    double cos(double p1,double p2,double p3);
    double scal(double p1, double p2, double p3, double c);
 
};
 
int main()
{
    system("chcp 1251");
    double a, b, c;
    algvector v1, v2;
    if(!v1.vvod("Ââåäèòå êîîðäèГ*Г*ГІГ» ïåðâîãî âåêòîðГ* : "))
        cout<<"ГЋГёГЁГЎГЄГ* ââîäГ*"<<endl;
    else
    if(!v2.vvod("Ââåäèòå êîîðäèГ*Г*ГІГ» âòîðîãî âåêòîðГ* : "))
        cout<<"ГЋГёГЁГЎГЄГ* ââîäГ*"<<endl;
    else
    {
        v1.sum(v2.GetX(),v2.GetY(),v2.GetZ(), a, b, c);
        cout<<"ÑóììГ* âåêòîðîâ : "<<a<<" "<<b<<" "<<c<<endl;
        v1.raz(v2.GetX(),v2.GetY(),v2.GetZ(), a, b, c);
        cout<<"ГђГ*Г§Г*îñòü âåêòîðîâ : "<<a<<" "<<b<<" "<<c<<endl;
 
        cout<<"ÄëèГ*Г* ïåðâîãî âåêòîðГ* : "<<v1.dlina()<<endl;
        cout<<"ÄëèГ*Г* âòîðîãî âåêòîðГ* : "<<v2.dlina()<<endl;
        c = v1.cos(v2.GetX(),v2.GetY(),v2.GetZ());
        cout<<"ÊîñèГ*ГіГ± ìåæäó âåêòîðГ*ìè\n"<<c<<"\n";
 
        b = v1.scal(v2.GetX(),v2.GetY(),v2.GetZ(), c);
        cout<<"ÑêГ*ëÿðГ*îå ïðîèçâåäåГ*ГЁГҐ âåêòîðîâ\n"<<b<<"\n";
    }
    system ("pause");
    return 0;
}
 
bool algvector::vvod(const char * msg)
{
    cout<<msg;
    bool bOK = true;
    if(!(cin>>x>>y>>z))
        bOK = false;
    if(!bOK)
    {
        cin.clear();
        cin.sync();
    }
    return bOK;
}
 
void algvector::sum
    (
        double p1,double p2,double p3, 
        double &a, double &b, double &c
    )
{
    a = x + p1;b = y + p2;c = z + p3;
}
 
void algvector::raz
    (
        double p1,double p2,double p3, 
        double &a, double &b, double &c
    )
{
    a = x - p1;
    b = y - p2;
    c = z - p3;
}
 
double algvector::dlina()
{
    return sqrt(x*x+y*y+z*z);
}
 
double algvector::cos(double p1,double p2,double p3)
{
    return (x*p1+y*p2+z*p3)/(sqrt(x*x+y*y+z*z)*sqrt(p1*p1+p2*p2+p3*p3));
}
 
double algvector::scal(double p1, double p2, double p3, double c)
{
    return sqrt(x*x+y*y+z*z)*sqrt(p1*p1+p2*p2+p3*p3)*c;
}
На скринах пример корректного и некорректного ввода. Думаю сам видишь какое мощное средство фильтрации ошибок bool vvod?
В заключение скажу, что для классов возможна перегрузка операторов + - / * и в кодах скажем твоя sum заменяется обычным оператором cout<<"sum = "<<v1 + v2<<endl; Я не показывал перегрузку, потому как вижу ты лишь в началае своего пути программиста и "непонятные крючки" только запутают
Миниатюры
Выделение и освобождение памяти в конструкторе и деструкторе   Выделение и освобождение памяти в конструкторе и деструкторе  
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
22.02.2013, 16:47     Выделение и освобождение памяти в конструкторе и деструкторе #9
а сумма векторов должна не так ли выглядеть?
C++
1
2
3
4
5
6
7
8
vector& summ(vector & in)
{
vector tmp;
tmp.x = x+ in.x;
tmp.y = y+ in.y;
tmp.z = z + in.z;
return tmp;
}
а в мейне vector
C++
1
2
3
a(1.0, 2.0, 3.0)
vector b(4.0, 1.1, 5,5)
vector c = a.summ(b);
а лучше перегрузить operator+()
nzk
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 7
23.02.2013, 19:07  [ТС]     Выделение и освобождение памяти в конструкторе и деструкторе #10
Спасибо всем за помощь.

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
зачем в данном задании вообще выделять память?
Это и есть суть задания.Для класса создать конструктор(для выделения памяти, открытия файлов, задания начальных значений при необходимости) и деструктор(для освобождения памяти, закрытия файлов, печати последних значений).



Добавлено через 10 минут
P.S. Про ввод я и сам знал. Уже придумать ничего не мог вот и начал писать что попало.А вот про возвращение только одного значения из трех я не знал, только то что так не делается а почему понятия не имел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 19:55     Выделение и освобождение памяти в конструкторе и деструкторе
Еще ссылки по теме:

C++ Выделение-освобождение памяти
C++ Освобождение памяти в деструкторе класса
C++ Освобождение и выделение динамической памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
23.02.2013, 19:55     Выделение и освобождение памяти в конструкторе и деструкторе #11
Цитата Сообщение от nzk Посмотреть сообщение
Это и есть суть задания.Для класса создать конструктор(для выделения памяти, открытия файлов, задания начальных значений при необходимости) и деструктор(для освобождения памяти (если была выделена), закрытия файлов, печати последних значений).
- вот как это задание стоит понимать. Для того концепта что был в первом посте, память не требуется совершенно.
Yandex
Объявления
23.02.2013, 19:55     Выделение и освобождение памяти в конструкторе и деструкторе
Ответ Создать тему
Опции темы

Текущее время: 11:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru