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

Исправить оишбку в коде - C++

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
10.03.2013, 11:33     Исправить оишбку в коде #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
#include <stdio.h>
#include <iostream>
#include <string>
class Unit
{
public:
    Unit(const char* name, int hitpoints, int damage)
    : hitpoints_(hitpoints), damage_(damage)
    {
        if(name != nullptr)
        {
            name_ = new char[strlen(name) + 1];
            strcpy(name_, name);
        }
    }
 
    ~Unit()
    {
        delete [] name_;
    }
 
    char* name_;
    int hitpoints_;
    int damage_;
};
 
 
void ShowStats(Unit unit)
{
    std::cout << unit.name_ << " - " << unit.hitpoints_ << " - " << unit.damage_;
}
int main()
{
    Unit marine("marine", 45, 6);
 
    ShowStats(marine);
    // Game cycle...
    ShowStats(marine);
 
    return 0;
}
ошибка в деструкторе, не могу его правильно написать.. самое главное, нельзя нечего убирать. можно только добавлять, а убирать нельзя.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 11:33     Исправить оишбку в коде
Посмотрите здесь:

Исправить ошибку в коде с++ C++
C++ Исправить ошибку в коде
C++ Исправить ошибки в коде
C++ исправить ошибку в коде
C++ Исправить ошибку в коде.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 12:32     Исправить оишбку в коде #2
добавьте конструктор копирования
C++
1
2
3
4
5
Unit(const Unit& u)
    {
        name_ = new char[strlen(u.name_) + 1];
        strcpy(name_, u.name_);
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 14:09     Исправить оишбку в коде #3
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
ошибка в деструкторе, не могу его правильно написать.. самое главное, нельзя нечего убирать. можно только добавлять, а убирать нельзя.
В чём ошибка в деструкторе?
C++
1
2
3
4
void ShowStats(Unit &unit)
{
    cout << unit.name_ << " - " << unit.hitpoints_ << " - " << unit.damage_ << endl;
}
KostyaKulakov
Заблокирован
15.03.2013, 11:18  [ТС]     Исправить оишбку в коде #4
собственно, я смотрел в отладки, после выхода из функции, вызывался деструктор, такой вопрос. зачем тут конструктор копирования?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 14:02     Исправить оишбку в коде #5
Деструктор здесь не при чём. Вы передаёте в функцию объект по значению, из-за этого проблемы. Память под копией name_ освобождается. Потом опять вызов функции, опять создаётся копия name_, по адресу в name_ уже муссор (что и выводится), при выходе из функции попытка освободить уже освобождённую память. Или передавайте объект по ссылке, или сделайте эту функцию методом класса.

Добавлено через 1 час 25 минут
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
зачем тут конструктор копирования?
Потому что конструктор копирования по умолчанию делает поверхностное копирование, т.е. просто копирует поля класса. Если там указатель, то копируется сам указатель, а не то, на что он указывает. В таких случаях определяют конструктор для глубокого копирования. Тогда у временных объектов будут свои указатели и своя память под ними, и не будет двойного освобождения памяти, как в этом случае.
Добавляете вот такой конструктор копирования и ошибка исчезнет:
C++
1
2
3
4
5
6
7
Unit(const Unit &obj)
{
    hitpoints_ = obj.hitpoints_;
    damage_ = obj.damage_;
    name_ = new char[strlen(obj.name_) + 1];
    strcpy(name_, obj.name_);
}
Yandex
Объявления
15.03.2013, 14:02     Исправить оишбку в коде
Ответ Создать тему
Опции темы

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