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

Почему деструктор работает неправильно? - C++

Восстановить пароль Регистрация
 
login
2 / 1 / 0
Регистрация: 16.04.2009
Сообщений: 90
11.10.2010, 15:28     Почему деструктор работает неправильно? #1
на лабараторной столкнулся в проблемой.
деструктор вызывается только один раз.
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
#include <cstring>
#include <iostream>
using namespace std;
 
class Person
{
private:
    char * LN;
    char * PN;
    char * FN;
    static int Number;
    static int Count;
    char FirstName[50];
    char LastName[50];
    char PartName[50];
         
 
public:
 
    const int Order;
    
    Person():Order(++Number)
    {
        ++Count;
        FirstName[0]=LastName[0]=PartName[0]='\x00';
    };
 
    Person(char FirstName[],char LastName[],char PartName[]) :Order(++Number)
    {
        
        this->SetFirstName(FirstName);
        this->SetLastName(LastName);
        this->SetPartName(PartName);
        ++Count;
    };
 
    Person(const Person &p):Order(++Number)
    {
        SetFirstName(p.FirstName);
        SetLastName(p.LastName);
        SetPartName(p.PartName);
        ++Count;
    };
 
    void SetFirstName(const char FN[])
    {       
        strcpy_s(FirstName,sizeof(FirstName),FN);
    };
 
    void SetFirstName()
    {
        
        FN=new char[50];
        std::cout<<"Enter FirstName"<<std::endl;
        std::cin>>FN;
        strcpy_s(FirstName,sizeof(FirstName),FN);
    };
    
    const char* GetFirstName() 
    {
        return FirstName;
    };
 
    void SetLastName(const char LN[])
    {
        strcpy_s(LastName,sizeof(LastName),LN);
    };
 
    void SetLastName()
    {
        
        LN=new char[50];
        std::cout<<"Enter LastName"<<std::endl;
        std::cin>>LN;
        strcpy_s(LastName,sizeof(LastName),LN);
    };
    
    const char* GetLastName()
    {
        return LastName;
    };
    
    void SetPartName(const char PN[])
    {
        strcpy_s(PartName,sizeof(PartName),PN);
    };
 
    void SetPartName()
    {
        
        PN=new char[50];
        std::cout<<"Enter PartName"<<std::endl;
        std::cin>>PN;
        strcpy_s(PartName,sizeof(PartName),PN);
    };
 
    const char* GetPartName()
    {
        return PartName;
    };
 
    ~Person ()
    {
        --Count;
        puts("Destructor works");
        std::cout<<"Time"<<std::endl;
    };
 
    static int GetCount()
    {
        return Count;
    }
};
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
// laba1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Person.h"
#include <iostream>
#include <cstring>
using namespace std;   
int Person::Count = 0;
int Person::Number = 0;
 
int _tmain(int argc, _TCHAR* argv[])
{
char* Name;
 
Person p1;
 
    p1.SetFirstName("FN1");
    p1.SetLastName();
    p1.SetPartName("PN1");
 
    Person *pp2 = new Person();
 
    pp2->SetFirstName("FN2");
    pp2->SetLastName("LN2");
    pp2->SetPartName("PN2");
 
    Person *pp3 = new Person("FN3", "LN3", "PN3");
    pp3->SetFirstName("First3");
    Person *p4 = new Person(p1);
 
    cout<<"Koli4estvo\n"<<Person::GetCount()<<endl;
    cout<<p1.Order<<pp2->Order<<pp3->Order<<p4->Order<<endl;
 
    cout<<"asa"<<endl;*/
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.10.2010, 17:34     Почему деструктор работает неправильно? #2
login:

Освободите блоки памяти, расположенные по адресам.
Эти адреса в указателях pp2,pp3 p4
Для освобождения используйте delete.
C++
1
2
3
delete pp2;
delete pp3;
delete p4;
C++ не имеет сборку мусора, поэтому надо делать delete.

Добавлено через 12 минут
login:
Я видел в реализации методов класса new, но ни где не видел delete,
скорее всего, объекты типа Person провоцируют утечки памяти.
login
2 / 1 / 0
Регистрация: 16.04.2009
Сообщений: 90
11.10.2010, 21:33  [ТС]     Почему деструктор работает неправильно? #3
когда программа завершается, она автоматически вызывает деструктор для каждого обьекта....а у меня он только один раз вызывается и все...
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.10.2010, 21:37     Почему деструктор работает неправильно? #4
когда программа завершается, она автоматически вызывает деструктор для каждого обьекта....а у меня он только один раз вызывается и все...
//---------------------------------------------------------
Для стековых объектов да, вызывается автоматически.
Для динамических, надо сделать delete, тогда будет вызван деструктор.
Yandex
Объявления
11.10.2010, 21:37     Почему деструктор работает неправильно?
Ответ Создать тему
Опции темы

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