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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
#1

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

26.10.2012, 19:30. Просмотров 1296. Ответов 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:...."

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

Освобождение и выделение памяти - C++
Помогите разобраться с программой, где здесь выделение памяти (как я понял это new) и где освобождение памяти. #include &lt;iostream&gt; ...

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

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

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

Выделение и освобождение памяти - C++
Вот встретился с вопросом какой вариант является более правильным и почему. char *Buffer1 = (char *)malloc(65536) char *Buffer2 =...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:39     Выделение и освобождение памяти #2
лично я не увидел кода инициализации переменной
C++
1
NumbCount
Добавлено через 1 минуту
и не ясно что такое
C++
1
NumbC
Buildog
40 / 40 / 2
Регистрация: 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;
}
вот полностью конструктор
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:40     Выделение и освобождение памяти #4
C++
1
2
3
    pOsnova = new int (NumbCount);
    pOstatok = new int (NumbCount);
    NumbCount = rhs.NumbCount;
Тут сначала происходит выделение памяти, а потом инициализация переменной NumbCount
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
26.10.2012, 19:41  [ТС]     Выделение и освобождение памяти #5
Вот блин, теперь буду иметь ввиду, я просто думал, что будет использоваться переменная изначального класса, спасибо большое
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
26.10.2012, 19:42     Выделение и освобождение памяти #6
когда скобки () вы создаете один элемент типа int. а когда [] то массив элементов типа int, соответсвенно должна происходить инициализация и освобождение памяти. А получается создаете один элемент а удаляете массив
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
26.10.2012, 19:42     Выделение и освобождение памяти #7
круглые скобки - выделение памяти под одно единственное и присваиваешь ему значение NumbCount
квадратные скобки - создание массива из NumbCount чисел.
Освобождать из под массива память надо с помощью delete[]
Ошибка очевидно не в квадратных скобках, а в порче памяти.
нет конструктора копирования
Значит возможно где-то неявно создаётся копия объекта и для неё вызывается деструктор, второй раз освобождая память, приводя к ошибке.
Ой, дочитал до конца! Croessmah прав
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
26.10.2012, 19:44     Выделение и освобождение памяти #8
Не успел
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 19:44     Выделение и освобождение памяти #9
Цитата Сообщение от Buildog Посмотреть сообщение
Вот блин, теперь буду иметь ввиду, я просто думал, что будет использоваться переменная изначального класса
C++
1
pOstatok = new int (NumbCount);
то же самое, что
C++
1
pOstatok = new int (this->NumbCount);
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 19:45     Выделение и освобождение памяти #10
По моему, у вас путаница с выделением памяти. Конструктор выдяляет память под массивы. Конструктор копирования просто под int, при этом память выделенная конструктором теряется. Потом работает деструктор, пытается освободить память под массивы, а указатели уже указывают просто на int. Отсюда ошибка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 19:49     Выделение и освобождение памяти
Еще ссылки по теме:

Выделение и освобождение памяти в конструкторе и деструкторе - C++
Есть программа с классом содержащим обьекты векторы. Однако по кончанию программы выбивате ошибку _block_type_is_vali(phead-&gt;nblockuse)....

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

Указатели на строки. Выделение и освобождение памяти - C++
Всем добрый день. Есть два указателя на char. Для первого выделяется память а у второго просто делаем копию с первого. Для 1-го...

Выделение и освобождение памяти для локальных переменных функций - C++
Привет Столкнулся со следующей проблемой. Написал простенькое приложение: читаем 1 строку из файла на диске, записываем 1 строку в файл...


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

Или воспользуйтесь поиском по форуму:
Buildog
40 / 40 / 2
Регистрация: 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;
...
}
Yandex
Объявления
26.10.2012, 19:49     Выделение и освобождение памяти
Ответ Создать тему
Опции темы

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