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

Динамическая память (строки), деструктор - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Подсчитать число элементов, входящих в непрерывные последовательности отрицательных чисел http://www.cyberforum.ru/cpp-beginners/thread595590.html
ЗАДАЧА Задан одномерный массив Х вещественных чисел. Подсчитать число элементов, входящих в непрерывные последовательности отрицательных чисел, содержащие k и более элементов. помогите с програмным кодом...
C++ Некоректно работает функция pow Здравствуйте! Пользуюсь компилятором Code Blocks! Использовал в программе для возведения в степень функцию pow, и заметил что некоторую степень считает не правильно! А именно 10 во второй, четвертой, восьмой, девятой выдаёт результат на 1 меньше! Тоесть 99, 9999 и т.д! Подскажите пожалуйста, это проблема в компиляторе, или сама функция так не коректно работает везде ? http://www.cyberforum.ru/cpp-beginners/thread595569.html
Шаблон дерева. Найти элементы на заданной глубине C++
Задача: Разработать шаблон класса для работы с двоичным деревом поиска. Реализовать следующие действия добавление элемента в дерево; удаление элемента из дерева; обход дерева (для печати элементов и т.д.); поиск в дереве. Найти количество элементов на заданной глубине. Шаблон реализовала:
C++ Записать этот массив в бинарный файл одной записью (не в цикле)
Создать файл в блокноте с числами, например: 1.4 1.234 2.104 и т.д. Считывать этот файл в массив, который надо динамически расширять под каждое считанное число, пока файл не будет прочитан Записать этот массив в бинарный файл одной записью (не в цикле) Заранее спасибо!!!!
C++ Дано натуральное число n. Найти A1B1+A2B2+... http://www.cyberforum.ru/cpp-beginners/thread595536.html
Дано натуральное число n. Найти A1B1+A2B2+...AnBn,где A1=B1=1;Ak=1/2*(sqrt(B(k-1))+1/2*A(k-1));Bk=2*(A(k-1))^2;k=1,2...n.
C++ Вычислить выражение Вычислить sh(x)=x+((x^3)/3!)+((x^5)/5!)+((x^7)/7!)... Есть ли какие-нибудь элементарные функции для степени и факториала? Чтобы просто в одно обозначение типа x^2(икс в квадрате) и fact(n). подробнее

Показать сообщение отдельно
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
04.06.2012, 15:39     Динамическая память (строки), деструктор
Ммм, понял, когда вызывается конструктор alcohol, сначала вызывается конструктор предка, там выделяется память, на нее указывает name, потом уже в конструкторе alcohol ещё раз выделяется память, и name уже указывает на другой участок памяти. Итого выделили два участка, на один указатель потеряли => память не освободили. Это раз. И два: дважды освобождение памяти по указателю name (вот здесь, видимо, и падало), сначала в деструкторе alcohol, потом - в fluid. Так работает:
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <cstring>
 
 
class fluid {
protected:
    char *name; // имя
    double density; // плотность напитка
public:
    fluid(void);
    fluid(char const*, double);
 
    ~fluid(void);
 
    void print(void); // функция печати
};
 
class alcohol:public fluid {
    double strength; // крепость
public:
    alcohol(void);
    alcohol(char const* _name, double _density, double _str);
    alcohol(char const* _name);
 
    ~alcohol(void);
 
    void print(void);
    void set_density(double _density);
    void set_strength(double _str);
};
 
 
fluid::fluid(void) {
    name = new char[13];
    strcpy(name, "Без названия");
    density = 0.;
}
 
fluid::fluid(char const* _name, double _density) {
    name = new char[strlen(_name)+1];
    density = _density;
 
    strcpy(name, _name);
}
 
fluid::~fluid(void) {
    delete[] name;
}
 
void fluid::print(void) {
    std::cout << std::endl << "Напиток: " << name << ", плотность: " << density << std::endl;
}
 
alcohol::alcohol(void) : fluid("Без названия", 0), strength(0) {
    //name = new char[13];
    //strcpy(name, "Без названия"); //\0");
    //strength = 0;
    //density = 0;
}
 
alcohol::alcohol(char const* _name, double _density, double _str) : fluid(_name, _density), strength(_str) {}
 
alcohol::alcohol(char const* _name) : fluid(_name, 0), strength(0) {}
 
alcohol::~alcohol(void) {
    //delete[] name;
}
 
void alcohol::print(void) {
    std::cout << std::endl << "Напиток: " << name << ", плотность: " << density << ", крепость: "<< strength << std::endl;
}
 
void alcohol::set_density(double _density) {density = _density;}
 
void alcohol::set_strength(double _str) {strength = _str;}
 
 
int main() {
   fluid A("Water", 10.);
   A.print();
 
   alcohol B;
   B.print();
}
http://liveworkspace.org/code/3e290c...dff172cb1c7db8
И да, у С-шных строк тип - const char* (указатель на константу).
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru