Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 2
1

Объяснить причины и способы устранения утечки памяти в деструкторе

29.12.2015, 19:29. Показов 1294. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему если убрать коммент с деструктора, что закомментирован выбивает ошибка: "утечка памяти"?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "cow.h"
int main()
{
    Cow roman;
    roman.ShowCow();
    Cow natali("Natali Kobrii", "Shoping", 45);
    natali.ShowCow();
    Cow lili(natali);
    lili.ShowCow();
    //natali.~Cow();
    lili.ShowCow();
    Cow masa = lili;
    masa.ShowCow();
    return 0;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef COW_H_
#define COW_H_
class Cow
{
private:
    char name[20];
    char * hobby;
    double weight;
public:
    Cow();
    Cow(const char * nm, const char * ho, double wt);
    Cow(const Cow & c);
    ~Cow();
    Cow & operator=(const Cow & c);
    void ShowCow() const;
};
#endif
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
#include <iostream>
#include <cstring>
#include "cow.h"
Cow::Cow()
{
    std:strcpy(name, "no name");
    hobby = new char[std::strlen("no name") + 1];
    std::strcpy(hobby,"no name");
    weight = 0;
}
Cow::Cow(const char * nm, const char * ho, double wt)
{
    std::strcpy(name, nm);
    hobby = new char[strlen(ho) + 1];
    std::strcpy(hobby, ho);
    weight = wt;
}
Cow::Cow(const Cow & c)
{
    std::strcpy(name, c.name);
    hobby = new char[strlen(c.hobby) + 1];
    std::strcpy(hobby, c.hobby);
    weight = c.weight;
}
Cow::~Cow()
{
    delete [] hobby;
}
Cow & Cow::operator=(const Cow & c)
{
    if (this == &c)
        return *this;
    std::strcpy(name, c.name);
    delete[] hobby;
    hobby = new char[strlen(c.hobby) + 1];
    std::strcpy(hobby, c.hobby);
    weight = c.weight;
    return *this;
}
void Cow::ShowCow() const
{
    using namespace std;
    cout << "Name is : " << name << endl;
    cout << "Hobby is : " << hobby << endl;
    cout << "Weight is : " << weight << endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2015, 19:29
Ответы с готовыми решениями:

Нюансы использования исключений: объяснить причины и способы устранения ошибки
Есть такой кусочек кода. Я хочу просмотреть всё что хранится в операционной памяти. Ну и когда я...

Найти причины и способы устранения ошибки
Во время откладки указатель на число выдает мусор типо -81791524 #include &lt;stdlib.h&gt; #include...

Найти причины и способы устранения ошибок в коде
В онлайн компиляторе выдает ошибки: Compiler Output: ZP9NviRq.c:2:16: error: math: No such file...

Найти причины и способы устранения ошибок в коде
Доброго времени суток! При компиляции появляются следующие ошибки! Помогите исправить их! 1)...

5
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.12.2015, 19:32 2
Лучший ответ Сообщение было отмечено filoso как решение

Решение

Цитата Сообщение от filoso Посмотреть сообщение
Почему если убрать коммент с деструктора, что закомментирован выбивает ошибка: "утечка памяти"?
потому что в этом случае он отрабатывает дважды.
и второй раз пытается освободить уже свободную память
0
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 2
29.12.2015, 19:36  [ТС] 3
Использовать деструктор самому нужно только когда используешь new с размещением?
0
23 / 23 / 5
Регистрация: 05.12.2013
Сообщений: 215
29.12.2015, 19:37 4
Цитата Сообщение от filoso Посмотреть сообщение
Использовать деструктор самому нужно только
никогда.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
29.12.2015, 19:44 5
Цитата Сообщение от Nelkor Посмотреть сообщение
никогда
Если placement new, тогда как?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.12.2015, 19:46 6
Цитата Сообщение от filoso Посмотреть сообщение
Использовать деструктор самому нужно только когда используешь new с размещением?
в тех случаях, когда автоматом он не вызовется.
new placement один из таких случаев.

вот ещё один случай, например:
Std::string в union -> segmentation fault
1
29.12.2015, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2015, 19:46
Помогаю со студенческими работами здесь

Найти причины и способы устранения ошибок в коде
Помогите исправить ошибку. unsigned long * A4B(unsigned long*a, unsigned long*b) { ...

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

Найти причины и способы устранения ошибок в коде (работа с векторами строк)
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;vector&gt; int main() { ...

Найти причины и способы устранения ошибок в коде и организовать файловый ввод/вывод
Уплотнить массив, удалив из него все нулевые строки и столбцы Почему то код не работает и как...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru