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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задача Четыре чертёнка http://www.cyberforum.ru/cpp-beginners/thread804489.html
Мир в опасности. Один известный мошенник по имени Остап умер, и, попав в ад, решил заключить сделку с дьяволом. Игра простая: четыре чертёнка делятся на две команды — «чёрные» и «чумазые» — и выходят на игровое поле. На игровом поле написаны в ряд числа от 1 до n, и игроки начинают по очереди ставить между ними чёрными чернилами знаки + или −. Задача «чёрных» — сделать так, чтобы после...
C++ проблемы с сортировкой пузырьком собственно сабж проблема заключается в том, что программа сортирует ЧАСТЬ массива. Допустим, надо отсортировать каждый столбец по уменьшению значения суммы цифр каждого элемента. Так программа правильно отсортировывает 14 элементов из 16, а 2 стоят в неправильном порядке. Не могу понять, наверное где-то в цикле ошибка. Помогите, люди! // moiproject.cpp: определяет точку входа для консольного... http://www.cyberforum.ru/cpp-beginners/thread804461.html
C++ Иерархическое дерево. Начало пути
Здравствуйте!!! Я перерыл много учебников и форумов и везде пишут о бинарных деревьях. В них я более менее разобрался, а вот как создать дерево, в котором может быть более 2 сыновей. У меня задание: написать программу, определяющую является ли узел i предком узла j. Программа у пользователя запрашивает узлы дерева в порядке прямого обхода.
вызвать неперегруженный оператор при наличии перегруженного C++
привет всем. возникла такая проблема: есть два объекта одного класса и перегруженный оператор=. одним из полей этих объектов является указатель на указатель(квадратная матрица порядка n). в теле перегруженного орератора проверяется, одинаковы ли размеры этих матриц. если нет, то нужно перевыделить память и выполнить присвоение. так вот, возможно ли внутри этого перегруженного оператора после...
C++ Найти дружественные числа (создавал в MingwStudio) http://www.cyberforum.ru/cpp-beginners/thread804437.html
Подскажите что не так #include <iostream.h> int sumdel(a) { int i,s; s=0; for(i=1;i<=a/2;i++) {if(a%i==0) s=s+i; } return s; }
C++ Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать? Ребята, если вникать, то вообще ничё непонятно. Вот смотрите: пусть у нас есть абстрактный класс abstr (abstr.h) и в нём определено, например 10 функций виртуальных функции. Эти функции реализованы в каком-то статическом классе stats (файлы stats.h и stats.cpp). И пусть мы вызываем например две из них в main.cpp, вот так: //main.cpp #include <windows.h> #include <stdio.h> #include "abstr.h"... подробнее

Показать сообщение отдельно
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 14:02     Исправить оишбку в коде
Деструктор здесь не при чём. Вы передаёте в функцию объект по значению, из-за этого проблемы. Память под копией 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_);
}
 
Текущее время: 02:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru