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

new/delete + конструктор/деструктор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:10     new/delete + конструктор/деструктор #1
Приветствую знатоков превеликого C++. Если возможно, объясните пожалуйста чайнику, сей момент. Я не могу понять как выделять память под данные. Выделяться/очищаться она должна в конструкторе/деструкторе. В конструкторе параметров несколько, для каждого нужно прописывать new? (Сколько я не искала примеров конструкторов с несколькими параметрами, попадались максимум с двумя и память выделялась только под первый.) Опять же, если конструктор работает, значит параметры к нему уже пришли, а это значит, что эти данные память себе уже отожрали. Если выделять память в main() через указатель... он указывает на адрес начала выделенной памяти (ведь так?). Да и когда мы её выделяем, нужно прописывать тип данных, а у меня они разнотипные. Разве может быть массив разнотипных данных?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2013, 18:10     new/delete + конструктор/деструктор
Посмотрите здесь:

C++ конструктор и деструктор
конструктор и деструктор в C++ C++
C++ Конструктор и деструктор
Конструктор/деструктор C++
C++ Конструктор и деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:18     new/delete + конструктор/деструктор #2
WolfSpirit, на самом деле вы разберетесь с этим, когда сталкнетесь. Т. е. появится необходимость. Ответить на Ваши вопросы врядли кто сможет.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
04.02.2013, 18:27     new/delete + конструктор/деструктор #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Some  {
public:
    Some(int n)  {
        cout << "Construct: " << this << endl;
        size = n;
        data = new int[size];
    }
    ~Some()  {
        cout << "Destruct: " << this << endl;
        delete []data;
    }
private:
    int *data;
    int size;
};
 
int main()  {
    Some arr(50);
    
    return 0;
}
Если честно не совсем понял суть вопроса...
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:33  [ТС]     new/delete + конструктор/деструктор #4
Ладно, давайте по другому.

classes.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef R_4_H
#define R_4_H
 
#include <QString>
 
class head {
    QString name; // название
    QString color; // цвет
    bool move; // возможность движения части тела
    bool addition; // наличие дополнений (глаза/уши/рот/и т.д.)
    double weight; // вес (кг)
    double cost; // стоимость ($)
public:
    head();
    head(QString name, QString color, bool move,
         bool addition, double weight, double cost);
    ~head();
    void show();
};
 
#endif // R_4_H

def.cpp
C++ (Qt)
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
#include "classes.h"
#include <QTextStream>
 
QTextStream cout(stdout);
 
void out(bool x) {
    if (x==0) cout << "No" << endl;
    else cout << "Yes" << endl;
}
 
head::head() {
    cout << "Head" << endl;
}
 
head::head(QString name, QString color, bool move,
           bool addition, double weight, double cost) {
    cout << "Headshot" << endl;
    this->name = name;
    this->color = color;
    this->move = move;
    this->addition = addition;
    this->weight = weight;
    this->cost = cost;
}
 
head::~head(){
    cout << "Delete..." << endl;
 
}
 
void head::show() {
    cout << "Head: " << name << endl;
    cout << "Color: " << color << endl;
    cout << "Move: "; out(move);
    cout << "Addition: "; out(addition);
    cout << "Weight: " << weight << " kg." << endl;
    cout << "Cost: " << cost << " $" << endl;
}

main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "classes.h"
#include "def.cpp"
 
int main()
{
    //head h1;
    //h1.show();
 
    head h2("Steel Hammer", "Black", false, true, 13.4, 348.57);
    h2.show();
 
    return 0;
}
Что, где, куда?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:36     new/delete + конструктор/деструктор #5
WolfSpirit, что Вас смущает?
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:41  [ТС]     new/delete + конструктор/деструктор #6
Цитата Сообщение от go Посмотреть сообщение
WolfSpirit, что Вас смущает?
Смущает то, что я не знаю где и как в конструкторе выделять память. 6 параметров, 3 вида входящих данных. И это только первая "голова", дальше их будет больше.

В конструкторе для каждого параметра (переменной) нужно выделять память? Или для всех сразу? И вообще в конструкторе ли это надо делать? Я уже не знаю как объяснить, что мне непонятно.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:52     new/delete + конструктор/деструктор #7
Цитата Сообщение от WolfSpirit Посмотреть сообщение
выделять память
Что Вы понимаете под этим?
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:58  [ТС]     new/delete + конструктор/деструктор #8
Цитата Сообщение от go Посмотреть сообщение
Что Вы понимаете под этим?
Вот у меня данные -> ("Steel Hammer", "Black", false, true, 13.4, 348.57), я полагаю под них нужно выделять память? Дальше их будет больше. Это только один объект класса (или как правильно?). А если их будет 10? Если не ошибаюсь, выделение памяти будет как-то связано с указателем(-лями). Возможно мы делаем указатель на выделенную память, а потом ему передаём ссылку на данные (сначала на одни, потом на другие). Но где они до этого будут хранится? По моему, чем больше я пытаюсь объяснить, что мне непонятно, тем больше я вас запутываю.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
04.02.2013, 19:03     new/delete + конструктор/деструктор #9
Сначала освойте где могут жить обьекты и переменные (ДП, стек, глобальная память).
Область видимости и время жизни тоже не мало значат.

Можно понять пример но теория важнее!
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 19:08     new/delete + конструктор/деструктор #10
Цитата Сообщение от WolfSpirit Посмотреть сообщение
head::head(QString name, QString color, bool move,
* * * * * *bool addition, double weight, double cost) {
При такой передаче помять выделяется на стэке. Туда заносится копия значений.

Цитата Сообщение от WolfSpirit Посмотреть сообщение
class head {
* * QString name; // название
* * QString color; // цвет
* * bool move; // возможность движения части тела
* * bool addition; // наличие дополнений (глаза/уши/рот/и т.д.)
* * double weight; // вес (кг)
* * double cost; // стоимость ($)
Память выделяется при создании объекта.


Вот смотрите

C++
1
2
int a; // Я выделил память на стэке под переменную.
a = 10; // занес туда значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p; // я объявил указатель. Под него тоже выделена память. Но он !!указывает!! на какой-то мусор
 
a = 10; // так писать не правильно. По смыслу не подходит. Мы задаем какой-то адрес 0х0А в своем адресном пространстве
 
*a = 10; //так присваиваем значение какой-то области памяти, куда указывает указатель.
// но будет ошибка, т.к. как мы не выделили память под него, и он портит чужую
 
a = new int; // выделили память, и вернули указатель на начало ее.
 
*a = 10; // OK
 
delete a; // освобождаем память, чтобы избежать утечки, когда в ней нет необходимости
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 19:29  [ТС]     new/delete + конструктор/деструктор #11
Цитата Сообщение от go Посмотреть сообщение
Вот смотрите
Плохо, быть лохом. С одной переменной, мне вроде ясно. Но как следует поступить в моём случае, чтобы экономить память? Данных будет много. Для каждого объекта её нужно будет выделять заново? Если она выделяется автоматом, может её можно просто освобождать? Я не требую конкретного ответа, но хоть задайте направление (книги, ссылки) где, что искать. Самостоятельно додуматься я не могу. Это огромная проблема. Неужели у всех всё легко получалось и все сразу всё понимали?
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
04.02.2013, 20:26     new/delete + конструктор/деструктор #12
Цитата Сообщение от WolfSpirit Посмотреть сообщение
Неужели у всех всё легко получалось и все сразу всё понимали?
Грабли у каждого свои. Посмотри предыдущие темы, может найдешь чтото для себя.

Как говорят индусы "зачем економить память - купим еще, она дешевая". Может проблема не там где ищете?
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 20:30  [ТС]     new/delete + конструктор/деструктор #13
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Может проблема не там где ищете?
Проблема в отсутствии мозга и наличии жгучего желания понять. Я пересмотрела несколько книг, туеву хучу ссылок по данной теме, но толку 0. Не идёт и всё тут. Видимо это не всем дано. Либо моё желание не настолько жгучее, как я считаю.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.02.2013, 20:58     new/delete + конструктор/деструктор #14
Ничего выделять не нужно.
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 21:01  [ТС]     new/delete + конструктор/деструктор #15
Цитата Сообщение от Герц Посмотреть сообщение
Ничего выделять не нужно.
А поподробнее можно? Будет куча данных -> займёт много памяти. Не выделять, так освобождать надо. А delete, без new не сработает.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.02.2013, 21:10     new/delete + конструктор/деструктор #16
Никаких new/delete в твоем примере нет.
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 21:11  [ТС]     new/delete + конструктор/деструктор #17
Цитата Сообщение от Герц Посмотреть сообщение
Никаких new/delete в твоем примере нет.
о_О Их нет, потому что я не понимаю куда и как их ставить нужно.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.02.2013, 21:13     new/delete + конструктор/деструктор #18
Никуда не нужно
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 21:14  [ТС]     new/delete + конструктор/деструктор #19
Цитата Сообщение от Герц Посмотреть сообщение
Никуда не нужно
О_о А-ля: "Пускай пропадает память, кому она нафиг нужна?"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2013, 21:18     new/delete + конструктор/деструктор
Еще ссылки по теме:

C++ Конструктор и деструктор
C++ С++. Конструктор, деструктор
Конструктор и деструктор C++

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

Или воспользуйтесь поиском по форуму:
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.02.2013, 21:18     new/delete + конструктор/деструктор #20
Ты объявляешь класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class head {
    QString name; // название
    QString color; // цвет
    bool move; // возможность движения части тела
    bool addition; // наличие дополнений (глаза/уши/рот/и т.д.)
    double weight; // вес (кг)
    double cost; // стоимость ($)
public:
    head();
    head(QString name, QString color, bool move,
         bool addition, double weight, double cost);
    ~head();
    void show();
};
Компилятор знает, что под экземпляр этого класса нужно резервировать память в размере
sizeof(name) + sizeof(color) + .. + sizeof(cost) - сумма размеров всех его полей

До исполнения конструктора класса по очереди вызываются конструкторы по-умолчанию для каждого из его полей в порядке их объявления, инициализируя поля.
При исполнении деструктора вызываются деструкторы каждого из полей.

Памяти некуда пропадать, так как ты ее не выделяешь.
Yandex
Объявления
04.02.2013, 21:18     new/delete + конструктор/деструктор
Ответ Создать тему
Опции темы

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