Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Buildog
40 / 40 / 5
Регистрация: 29.04.2012
Сообщений: 185
#1

Выделение и освобождение памяти

26.10.2012, 19:30. Просмотров 1396. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Пишу класс по ООП, и назрел один вопрос, связанный с моментом выделения и освобождения памяти.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SOK
{
public:
    SOK(int number);
    ~SOK();
    void Show () const;
    void ChangeNumb (int Numb);
    SOK (const SOK &);
 
private:
    int *pOsnova;
    int *pOstatok;
    int NumbCount;
};
C++
1
2
3
4
5
6
7
8
9
10
11
...
pOstatok = new int [NumbC];
    pOsnova = new int [NumbC];
    cout<<"Ostatok { ";
    for (int i=0; i<NumbC; i++)
    {
        pOstatok[i]=n%A[i];
        pOsnova[i] = A[i];
        cout<<pOstatok[i]<<" ";
    }
...
C++
1
2
3
4
5
6
7
SOK::~SOK ()
{
    delete []pOstatok;
    pOstatok = 0;
    delete []pOsnova;
    pOsnova=0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
SOK::SOK (const SOK & rhs)
{
    pOsnova = new int (NumbCount);
    pOstatok = new int (NumbCount);
    NumbCount = rhs.NumbCount;
    for (int i=0; i<NumbCount; i++)
    {
        pOsnova[i] = rhs.pOsnova[i];
        pOstatok[i] = rhs.pOstatok[i];
    }
}

Собственно возникшая проблема состоит в следующем, вот в таком варианте (прошу обратите внимание на скобки, при выделении и освобождении памяти) Программа в самом конце выдаёт исключительную ситуацию, при вызове деструктора. Если я в конструкторе, в выделении памяти ставлю круглые скобки, то деструктор так же работает неправильно, НО! Если я в конструкторе-копировщике пишу так же, как в конструкторе:
C++
1
2
    pOsnova = new int [NumbCount];
    pOstatok = new int [NumbCount];
Ошибку выбивает сразу же...
"Debug error... Invalid allocation size:...."

В чем причина? Что за колдовство со скобками?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 19:30
Ответы с готовыми решениями:

Выделение-освобождение памяти
Добрый день. Написал заготовку под программу. Возник вопрос: правильно ли...

Выделение и освобождение памяти
Вот встретился с вопросом какой вариант является более правильным и почему. ...

выделение и освобождение памяти
В моей программе есть следующий код: char* lexems; // массив указателей...

Освобождение и выделение памяти
Помогите разобраться с программой, где здесь выделение памяти (как я понял это...

Выделение и освобождение памяти в c++
Не давно наткнулся на такую замечательность : system(&quot;PAUSE&quot;);//1 раз int...

10
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,368
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:39 #2
лично я не увидел кода инициализации переменной
C++
1
NumbCount
Добавлено через 1 минуту
и не ясно что такое
C++
1
NumbC
0
Buildog
40 / 40 / 5
Регистрация: 29.04.2012
Сообщений: 185
26.10.2012, 19:40  [ТС] #3
Ну я просто не стал полностью весь код выписывать, сейчас добавлю тогда

Добавлено через 54 секунды
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
SOK::SOK (int n)
{
    if (n==0) 
        cout<<"Enter number and number system"<<endl;
    int A[]={2, 3, 5, 7, 11, 13, 17};
    int NumbC = 0;
    int count = 1; 
    for (int i=0; i<sizeof(A)/sizeof(int); i++)
    {
        if (n>count)
        {
            count *= A[i];
            NumbC++;
        }
    }
    ChangeNumb (NumbC);
    pOstatok = new int [NumbC];
    pOsnova = new int [NumbC];
    cout<<"Ostatok { ";
    for (int i=0; i<NumbC; i++)
    {
        pOstatok[i]=n%A[i];
        pOsnova[i] = A[i];
        cout<<pOstatok[i]<<" ";
    }
    cout<<"}"<<endl;
}
вот полностью конструктор
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,368
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:40 #4
C++
1
2
3
    pOsnova = new int (NumbCount);
    pOstatok = new int (NumbCount);
    NumbCount = rhs.NumbCount;
Тут сначала происходит выделение памяти, а потом инициализация переменной NumbCount
1
Buildog
40 / 40 / 5
Регистрация: 29.04.2012
Сообщений: 185
26.10.2012, 19:41  [ТС] #5
Вот блин, теперь буду иметь ввиду, я просто думал, что будет использоваться переменная изначального класса, спасибо большое
0
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,381
26.10.2012, 19:42 #6
когда скобки () вы создаете один элемент типа int. а когда [] то массив элементов типа int, соответсвенно должна происходить инициализация и освобождение памяти. А получается создаете один элемент а удаляете массив
1
Kuzia domovenok
2263 / 2032 / 459
Регистрация: 25.03.2012
Сообщений: 7,197
Записей в блоге: 1
26.10.2012, 19:42 #7
круглые скобки - выделение памяти под одно единственное и присваиваешь ему значение NumbCount
квадратные скобки - создание массива из NumbCount чисел.
Освобождать из под массива память надо с помощью delete[]
Ошибка очевидно не в квадратных скобках, а в порче памяти.
нет конструктора копирования
Значит возможно где-то неявно создаётся копия объекта и для неё вызывается деструктор, второй раз освобождая память, приводя к ошибке.
Ой, дочитал до конца! Croessmah прав
1
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,381
26.10.2012, 19:44 #8
Не успел
0
Croessmah
++Ͻ
14543 / 8302 / 1560
Регистрация: 27.09.2012
Сообщений: 20,368
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:44 #9
Цитата Сообщение от Buildog Посмотреть сообщение
Вот блин, теперь буду иметь ввиду, я просто думал, что будет использоваться переменная изначального класса
C++
1
pOstatok = new int (NumbCount);
то же самое, что
C++
1
pOstatok = new int (this->NumbCount);
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 19:45 #10
По моему, у вас путаница с выделением памяти. Конструктор выдяляет память под массивы. Конструктор копирования просто под int, при этом память выделенная конструктором теряется. Потом работает деструктор, пытается освободить память под массивы, а указатели уже указывают просто на int. Отсюда ошибка.
0
Buildog
40 / 40 / 5
Регистрация: 29.04.2012
Сообщений: 185
26.10.2012, 19:49  [ТС] #11
Всем спасибо, за то что откликнулись) оказывается дело было в том, что я конструкторе-копировщике неправильно организовал присваивание
Надо было так
C++
1
2
3
4
5
6
{
    NumbCount = rhs.NumbCount;
    pOsnova = new int [NumbCount];
    pOstatok = new int [NumbCount];
...
}
Вместо

C++
1
2
3
4
5
6
{
    pOsnova = new int [NumbCount];
    pOstatok = new int [NumbCount];
    NumbCount = rhs.NumbCount;
...
}
0
26.10.2012, 19:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 19:49

Освобождение и выделение динамической памяти
Привет народ, такой вопрос: Допустим в main, указателю выделил память, всё...

Выделение и освобождение памяти в конструкторе и деструкторе
Есть программа с классом содержащим обьекты векторы. Однако по кончанию...

выделение памяти и никогда не выполняете* ее освобождение
Как это можно сделать написать программу с бесконечным циклом» в котором...


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

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

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