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

Ошибка при вызове деструктора - C++

Восстановить пароль Регистрация
 
seruy-t
 Аватар для seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
28.10.2013, 13:54     Ошибка при вызове деструктора #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
class building                              
{
private:
    string *location_street;
    unsigned int *number_of_building;
public : 
    building()
    {
        location_street = new string("Default");
        number_of_building = new unsigned int (0);
    }                                   //дефолтний конструктор
 
 
    string getLocation_steet()
    {
        string tmp = *location_street;
        return tmp;
    }
    void setLocation_street(string *location)
    {
        location_street=location ;
    }
 
    int getNumber_of_building()
    {
        int tmp= *number_of_building;
        return tmp;
    }
    void setNumber_of_building(unsigned int * numb)
    {
        number_of_building= numb;
    }
    virtual ~building()                     //віртуальний деструктор
    {
        delete building::location_street;
        delete building::number_of_building;
    }
};
Вроде-бы Работает, но при попытке освободить память
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _tmain(int argc, _TCHAR* argv[])
{
    string s;
    unsigned int num = 52;
    cout<<"ENTER IT!\n";
    getline(cin,s);
    building *b = new building;
    b->setLocation_street(&s);
    b->setNumber_of_building(&num);
    cout<<b->getLocation_steet()<<","<<b->getNumber_of_building()<<endl;
    delete b;                                                       //  если от этого отказаться то ошибка не вылетает 
 
    system("pause");
    return 0;
}
Миниатюры
Ошибка при вызове деструктора  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
28.10.2013, 14:04     Ошибка при вызове деструктора #2
C++
1
location_street=location
присваиваете указатели, в результате чего получаете
1) Утечку памяти, т.к. больше нет указателя на выделенную в конструкторе память
2) location содержит адрес объекта s, который выделен на стеке функции и применять к нему delete нельзя

Добавлено через 56 секунд
C++
1
number_of_building= numb;
тут тоже самое.
seruy-t
 Аватар для seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
28.10.2013, 14:11  [ТС]     Ошибка при вызове деструктора #3
Croessmah, Извините, но , кажется, я вас не совсем понял.

C++
1
2
3
4
void setLocation_street(string location)
    {
        *location_street=location ;
    }
Должно быть так ?


Цитата Сообщение от Croessmah Посмотреть сообщение
2) location содержит адрес объекта s, который выделен на стеке функции и применять к нему delete нельзя
Это понял, но знаю что с этим делать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
28.10.2013, 14:31     Ошибка при вызове деструктора #4
C++
1
2
3
4
    void setLocation_street(const string * location)
    {
        *location_street=*location ;
    }
C++
1
2
3
4
    void setLocation_street(const string & location)
    {
        *location_street=location ;
    }
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
28.10.2013, 14:45     Ошибка при вызове деструктора #5
Совсем не разбираюсь в этом)))
Так просто интересная тема, изучаю)
и вот у вас в 14ой строке
C++
1
string getLocation_steet()
так и должно быть,?
Просто везде street а тут steet...
Croessmah
28.10.2013, 14:51
  #6

Не по теме:

Цитата Сообщение от Alex_Skripa Посмотреть сообщение
так и должно быть,?
А потом везде студия "подсказала" правильный вариант

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 15:15     Ошибка при вызове деструктора
Еще ссылки по теме:

Программа выдаёт ошибку при вызове деструктора C++
C++ Ошибка при вызове деструктора
C++ При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

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

Или воспользуйтесь поиском по форуму:
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
28.10.2013, 15:15     Ошибка при вызове деструктора #7
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


А потом везде студия "подсказала" правильный вариант

)Да чет я и не подумал)))
Yandex
Объявления
28.10.2013, 15:15     Ошибка при вызове деструктора
Ответ Создать тему
Опции темы

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