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

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

Войти
Регистрация
Восстановить пароль
 
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

new и delete - C++

15.07.2013, 14:40. Просмотров 662. Ответов 18
Метки нет (Все метки)

Ошибка, незнаю как для моего класса выделить память. Как исправить?


C++
1
2
3
4
5
6
7
8
9
class MyClass {
int a, b, c;
public:
MyClass(int a, int b, int c)
}
 
void main(){
  MyClass *ptr = new MyClass[10];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 14:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос new и delete (C++):

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что "delete a, b;" эквивалентно "delete a; delete b;" ?

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include <iostream> using namespace std; class point { ...

New/Delete - C++
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет очищена, при использовании delete, область выделенная...

18
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:42 #2
C++
1
MyClass *ptr = new MyClass( 1, 2, 3 );
Только у тебя в описании класса ошибка, не хватает тела цикла конструктора.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
15.07.2013, 14:43 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass {
int a, b, c;
public:
MyClass(int _a, int _b, int _c)
  {a=_a; b=_b; c=_c;}
};
 
void main(){
  MyClass *ptr[10];
  for(int i=0; i<10; i++)
    ptr[i] = new MyClass(i, i, 10);
}
1
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2013, 14:46 #4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
{a=_a; b=_b; c=_c;}
но зачем, если есть список инициализации?
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
15.07.2013, 14:50 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass 
{
private:
    int a, b, c;
public:
    MyClass(): a(0), b(0), c(0)
    {}
    MyClass(int aGet, int bGet, int cGet): a(aGet), b(bGet), c(cGet)
    {}
};
 
int main() 
{
 
    MyClass *ptr = new MyClass[10];
 
    return 0;
}
*Конструктор по умолчанию не обязателен.
**Если я не ошибаюсь поля класса по умолчанию private
1
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
15.07.2013, 14:53 #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
но зачем, если есть список инициализации?
Ибо нагляднее.
C++
1
2
3
MyClass(int _a, int _b, int _c)
:a(_a), b(_b), c(_c)
{}
Добавлено через 23 секунды
Цитата Сообщение от Ilot Посмотреть сообщение
**Если я не ошибаюсь поля класса по умолчанию private
Так и есть.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
15.07.2013, 15:18 #7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ибо нагляднее.
C++
1
MyClass(int a, int b, int c) :a(a), b(b), c(c) {}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 16:43 #8
А чтобы можно было создавать массивы (судя по всему ТС это нужно), имеет смысл задать параметры по умолчанию и объявить конструктор явным:
C++
1
explicit MyClass(int a=0, int b=0, int c=0) :a(a), b(b), c(c) {}
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 16:46 #9
А так что мешает?
C++
1
2
MyClass() :a(0), b(0), c(0) {}
MyClass(int a, int b, int c) :a(a), b(b), c(c) {}
Необходимость в параметрах по-умолчанию может быть вовсе ни к чему.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 16:56 #10
Цитата Сообщение от lazybiz Посмотреть сообщение
А так что мешает?
Ничто не мешает. Выбирайте вариант, который будет предпочтительнее для конкретной задачи.
Если вызовы конструктора с одним или двумя аргументами не приемлемы, то можно использовать Ваш вариант. Хотя я бы сделал несколько иначе (C++11):
C++
1
2
MyClass() :MyClass( 0, 0, 0) {}
MyClass(int a, int b, int c) :a(a), b(b), c(c) {}
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.07.2013, 17:10 #11
Ну вот к конструкции с делегирующими конструкторами надо как раз подходить очень и очень осторожно. Потому что если объемлющий конструктор выбросит исключение, мы попали :-(
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 17:22 #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Потому что если объемлющий конструктор выбросит исключение, мы попали :-(
В каком смысле "попали"? Объект ведь не будет считаться сконструированным, пока самый внешний конструктор успешно не завершиться.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.07.2013, 17:31 #13
Нет. Он будет считаться "сконструированным" (и для него будет вызван деструктор!), как только завершится первый конструктор. Вот пример кода: (компиль GCC 4.8)
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
#include <iostream>
#include <stdexcept>
using namespace std;
 
class Simple
{
    int value;
 
public:
    Simple(): value(0) { cout << "Simple default ctor" << endl; }
    Simple(int i): value(0) { cout << "Simple(int) ctor" << endl; throw runtime_error("some shit"); }
    ~Simple() { cout << "Simple dtor" << endl; }
};
 
class Test
{
    int value;
 
public:
    Test(): value(0) { cout << "Test default ctor" << endl; }
    Test(int i): Test() { cout << "Test(int) ctor" << endl; throw runtime_error("oooops!!!"); }
    ~Test() { cout << "Test dtor" << endl; }
};
 
int main()
{
    try
    {
        {
            Simple();
        }
        {
            Simple(1);
        }
    }
    catch(exception& ex)
    {
        cout << ex.what() << endl;
    }
    cout << endl;
 
    try
    {
        {
            Test();
        }
        {
            Test(1);
        }
    }
    catch(exception& ex)
    {
        cout << ex.what() << endl;
    }
    return 0;
}
Вывод:
Simple default ctor
Simple dtor
Simple(int) ctor
some shit

Test default ctor
Test dtor
Test default ctor
Test(int) ctor
Test dtor
oooops!!!
2
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.07.2013, 17:45 #14
CheshireCat, хотя, логика в этом есть. Если первый конструктор завершился, то объект создан. Остальные действия (внешний конструктор) должны обеспечивать более "специфическую" настройку полноценного созданного объекта. Но мне пока всё-таки не очень ясна суть "попадания", которое Вы упомянули.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.07.2013, 17:55 #15
Да, логика есть, я согласен. А суть "попадалова" в том, что деструктор может совершить действия, к которым "недоделанный" объект еще не готов, и которые не были предусмотрены программистом, - например, если в деструкторе закрывается соединение с базой данных, а открывается оно - только в объемлющем конструкторе. И, например, управляющие поля в момент вызова деструктора еще содержат "мусор". Да мало ли что еще...

Вывод из этого эксперимента такой: первый же конструктор должен оставить объект в полностью валидном состоянии, не полагаясь на возможные последующие вызовы других конструкторов для "достройки" объекта. Чтобы деструктор не "уронил" случайно недостроенный объект, а с ним - и всю программу. Вот об этом программист должен помнить постоянно.

Именно поэтому подходить к делегированию конструкторов нужно очень осторожно и вдумчиво.
1
15.07.2013, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 17:55
Привет! Вот еще темы с ответами:

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...


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

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

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