Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Armatus
53 / 53 / 28
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
#1

Утечка памяти - C++

11.05.2016, 22:00. Просмотров 223. Ответов 7
Метки нет (Все метки)

Где я допустил ее(утечку)?

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
#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <cstring> 
#include <string> 
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();
 
};
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() {
    weight = 0;
    hobby = new char[1];
    hobby[0] = '\0';
    name[0] = '\0';
}
Cow::~Cow() {
    delete[] hobby;
}
void Cow::showCow() {
    using std::cout;
    using std::endl;
    cout << "Name cow: "<< name <<endl;
    cout << "Hobby: "<< hobby<<endl;
    cout << "weight: " <<weight<< endl;
 
}
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::operator=(const Cow & c) {
    strcpy(name, c.name);
    hobby = new char[strlen(c.hobby) + 1];
    strcpy(hobby, c.hobby);
    weight = c.weight;
    return *this;
}
int main() {
    using namespace std;
    Cow first;
    first.showCow();
    Cow Second("ksha", "asd", 20);
    Second.showCow();
    Cow third = first;
    first.showCow();
    Cow four(Second);
    Second.showCow();
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtDumpMemoryLeaks();
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2016, 22:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Утечка памяти (C++):

Утечка памяти - C++
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель ...

Утечка памяти - C++
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable; дополняю его таким образом ...

утечка памяти - C++
Может кто-то проверить есть ли здесь утечка памяти? Мне почему-то кажется что есть. В задачи нужно когда пользователь сделал операции...

Утечка памяти - C++
Господа подскажите как узнать какая п̶а̶д̶л̶а̶ переменная жрет память? Или как посмотреть сколько вообще переменных и объектов находятся в...

Утечка памяти?! - C++
Джесс Либерти и Дэвид Хорват &quot;Освой самостоятельно С++ за 24 часа&quot;, вырезка из листинга 15.4 (стр 233): Строка 26 - Утечка памяти?...

Утечка памяти - C++
Подскажите, где здесь может возникать утечка памяти? Вроде везде, где можно - чищу... ///////////////////////////////////// // It's...

7
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
11.05.2016, 22:49 #2
В operator= перед тем как новое копировать, надо старое удалить.
0
Armatus
53 / 53 / 28
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
11.05.2016, 22:54  [ТС] #3
nmcf, так?
C++
1
2
3
4
5
6
7
8
Cow & Cow::operator=(const Cow & c) {
    delete[] hobby;
    strcpy(name, c.name);
    hobby = new char[strlen(c.hobby) + 1];
    strcpy(hobby, c.hobby);
    weight = c.weight;
    return *this;
}
0
nmcf
5756 / 5067 / 1734
Регистрация: 14.04.2014
Сообщений: 20,749
11.05.2016, 22:55 #4
Да.
0
Armatus
53 / 53 / 28
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
11.05.2016, 23:14  [ТС] #5
nmcf, пробовал уже я так, как было утечки 10 байт, так и осталось.

Добавлено через 35 секунд
nmcf,
C++
1
2
3
4
5
6
7
8
9
10
11
Detected memory leaks!
Dumping objects ->
{191} normal block at 0x00824960, 4 bytes long.
 Data: <asd > 61 73 64 00 
{186} normal block at 0x00823EC0, 1 bytes long.
 Data: < > 00 
{181} normal block at 0x008257C0, 4 bytes long.
 Data: <asd > 61 73 64 00 
{143} normal block at 0x00823E90, 1 bytes long.
 Data: < > 00 
Object dump complete
0
nimazzzy
Заблокирован
11.05.2016, 23:23 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не знаю, как предполагается работает _CrtDumpMemoryLeaks();, но если это обычная функция, то деструкторы твоих переменных вызовутся уже после ее вызова (когда будет зывершаться main). Ясен пень, что на момент вызова _CrtDumpMemoryLeaks память еще не освобождена, так как локальные переменные еще не ушли из области видимости.
Вот проверка отдельной тулой, а не вставкой в код разных вызовов:
==3481== Memcheck, a memory error detector
==3481== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==3481== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==3481== Command: ./a.out
==3481==
Name cow:
Hobby:
weight: 0
Name cow: ksha
Hobby: asd
weight: 20
Name cow:
Hobby:
weight: 0
Name cow: ksha
Hobby: asd
weight: 20
==3481==
==3481== HEAP SUMMARY:
==3481== in use at exit: 0 bytes in 0 blocks
==3481== total heap usage: 4 allocs, 4 frees, 10 bytes allocated
==3481==
==3481== All heap blocks were freed -- no leaks are possible
==3481==
==3481== For counts of detected and suppressed errors, rerun with: -v
==3481== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
1
Paraponera
9 / 9 / 3
Регистрация: 22.04.2015
Сообщений: 37
Завершенные тесты: 1
11.05.2016, 23:33 #7
Возьмите код в блок {} без _CrtDumpMemoryLeaks();
0
Armatus
53 / 53 / 28
Регистрация: 24.03.2016
Сообщений: 377
Завершенные тесты: 4
11.05.2016, 23:35  [ТС] #8
nimazzzy, спасибо вам за ответ.
0
11.05.2016, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2016, 23:35
Привет! Вот еще темы с ответами:

Утечка памяти в - C++
Кто подскажет плиз. Тут у меня утечка памяти foreach (var file in xpsFiles) { ...

Утечка памяти - C++
Помогите с кодом, вот написал реализацию стека по заданию. Преподаватель попросил проверить, верно ли я использую delete, ибо mas в классе...

Утечка памяти - C++
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в одном из мест где на мой взгляд она происходит... Array...

Утечка памяти - C++
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня маленькая программка, выловил бы легко, но в 2000 строк кода все...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.