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

Ошибка деструктора - C++

Восстановить пароль Регистрация
 
Sasha760
1 / 1 / 0
Регистрация: 03.05.2013
Сообщений: 27
05.05.2013, 21:14     Ошибка деструктора #1
Имеется шаблон класса- динамического массива. После создания функции push_back начал ругаться конструктор. Объясните пожалуйста в чем дело?
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
#include<iostream>
#include<time.h>
#include<stdlib.h>
 
using namespace std;
template<typename T> class myvector
{
private:
    int size;   
    T* p;
public:
    myvector (int s = 10)
{
    size=s;
    p = new T[size];
    srand(time(0));
    for(int i=0;i<size;i++)
    p[i]=rand()%100;
}
void show()
{ 
    for(int i = 0; i<size; ++i)        
    cout << p[i] << ' ';
    cout << endl;
}
void push_back();//добавляем элемент в конец
~myvector(){delete[] p;cout<<"memory is free"<<endl;}
};
template<class T> void myvector<T>::push_back()
{
    
 
    T *u=new T[size++];
    
    for(int i=0;i<size-1;i++)
    {
        u[i]=p[i];
    }
    delete []p;
    cout<<"what do you want to add?"<<endl;
    cin>>u[size-1];
    p=u;
    
}
int main()
{
    myvector<int> a1(2);
    a1.show();
    a1.push_back();
    a1.show();
    
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
05.05.2013, 21:31     Ошибка деструктора #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> void myvector<T>::push_back()
{
    int newsize = size + 1;
    T *u=new T[newsize];
    
    for(int i = 0; i < size; i++)
        u[i] = p[i];
    
    delete []p;
    cout<<"what do you want to add?"<<endl;
    cin >> u[newsize-1];
    p = u;
}
Добавлено через 38 секунд
В этой функции ошибка. В своем варианте вы освобождаете больше, чем надо.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 21:31     Ошибка деструктора #3
Sasha760,
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
05.05.2013, 21:32     Ошибка деструктора #4
Цитата Сообщение от metaluga145 Посмотреть сообщение
Вы вызываете деструктор класса в классе. Как Вы думаете, в каком состоянии будет находится класс после такого?
В какой строке?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 21:36     Ошибка деструктора #5
bgm123, где Вы это видите?

Добавлено через 1 минуту
Цитата Сообщение от bgm123 Посмотреть сообщение
for(int i = 0; i < size; i++)
* * * * u[i] = p[i];
Вместо присваивания поэлементно, быстрее будет использовать memcpy
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
05.05.2013, 21:36     Ошибка деструктора #6
Вообще лучше написать функцию вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void myvector::push_back()
{   
    int *buf = new int[size + 1];
        
    for(int i = 0; i < size; i++)
        buf[i] = p[i];
    
    delete []p;
 
    size++;
    
    std::cout << "what do you want to add?" << endl;
    std::cin >> buf[size - 1];
    
    p = buf;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
05.05.2013, 21:38     Ошибка деструктора #7
bgm123, вообще по канонам, функция push_back принимает значение, которое будет добавлено в конец, и спрашивать "что Вы хотите добавить?" как-то не логично

Добавлено через 19 секунд
ибо не всегда надо добавлять что-то из консоли
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
05.05.2013, 21:45     Ошибка деструктора #8
Sasha760,
сложно сказать наверняка, надо в компиляторе смотреть, но так сходу нашёл у вас ошибку в листинге, не в конструкторе, а в самом методе push_back() :

вместо
C++
1
T *u=new T[size++];
следует писать
C++
1
T *u=new T[++size];
это принципиально, потому что запись cin<<[size-1] будет уже с другим size, отличным от выделенного массива

исправьте этот пункт и скажите результат
Sasha760
1 / 1 / 0
Регистрация: 03.05.2013
Сообщений: 27
05.05.2013, 21:55  [ТС]     Ошибка деструктора #9
abit, , да вы совершенно права, Деструктор не выдал ошибки

Добавлено через 3 минуты
Цитата Сообщение от abit Посмотреть сообщение
Sasha760,
сложно сказать наверняка, надо в компиляторе смотреть, но так сходу нашёл у вас ошибку в листинге, не в конструкторе, а в самом методе push_back() :

вместо
C++
1
T *u=new T[size++];
следует писать
C++
1
T *u=new T[++size];
это принципиально, потому что запись cin<<[size-1] будет уже с другим size, отличным от выделенного массива

исправьте этот пункт и скажите результат
Но я все равно не понимаю, в чем принципиальное отличие? С каким size будет если T *u=new T[size++]
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
05.05.2013, 21:57     Ошибка деструктора #10
Sasha760,
в случае new T[size++] сначала произойдёт выделение памяти размером size, а потом инкрементирование, а в new T[++size] - сперва инкрементирование, а потом выделение памяти размером size (увеличенного)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2013, 21:59     Ошибка деструктора
Еще ссылки по теме:

Ошибка при вызове деструктора C++
Ошибка при работе деструктора C++
C++ Ошибка при вызове деструктора

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

Или воспользуйтесь поиском по форуму:
Sasha760
1 / 1 / 0
Регистрация: 03.05.2013
Сообщений: 27
05.05.2013, 21:59  [ТС]     Ошибка деструктора #11
abit, Да да да, точно, спасибо большое!
Yandex
Объявления
05.05.2013, 21:59     Ошибка деструктора
Ответ Создать тему
Опции темы

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