0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 1
1

C++ block type is valid phead nblockuse

15.10.2014, 13:05. Показов 3023. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый. Задача такая : определить класс pvector, похожий на вектор указателей, за исключением того, что он содержит указатели объекта и каждый объект уничтожается его деструктором

Моё видение решения данной задачи :
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
template<class T> class pvector : vector<T> {
public:
    vector<T*> v;
public:
    pvector(int n);
    pvector();
    pvector(const pvector& a);
 
    ~pvector();
};
 
template<class T> pvector<T>::pvector(int n)
{
    v.clear();
    v.resize(n);
    for(int i = 0; i < v.size(); ++ i)
        v[i] = new T(0);
 
}
 
template<class T> pvector<T>::pvector(const pvector& a)
{
    v = a.v;
}
 
template<class T> pvector<T>::pvector()
{
    v.clear();
}
 
template<class T> pvector<T>::~pvector()
{
    for(int i = 0; i < v.size(); ++ i)
    {
        //delete v[i];
        //v[i] = 0;
    }
    cout << " destructor is here \n";
}
 
template<class T> ostream& operator<<(ostream& os, pvector<T> vect)
{
    for(int i = 0; i < vect.v.size(); ++ i)
        os << *(vect.v[i]) << " ";
    return os;
}
 
int main()
{
    pvector<double> p(5);
    cout << p << "\n";
    *(p.v[2]) = 6;
    cout << p << "\n";
 
    system("pause");
}
Вектор указателей оставил в паблике, чтобы проще было исправлять ошибки.

Проблема следующая: с удивлением обнаружил, что после компиляции данного кода сообщение "destructor is here" вызывается два раза до выхода из программы, и один раз в момент выхода(т.е. когда он и должен вызываться). С этим, думаю и связано появление ошибки. Хотелось бы узнать, почему деструктор вызывается после использования cout.

Спасибо.

Добавлено через 10 минут
Нашёл у себя ошибку, кому интересно: проблема была связана с конструктором копирования
C++
1
2
3
4
template<class T> pvector<T>::pvector(const pvector& a)
{
    v = a.v;
}
Это неправильный код.

Вот правильный вариант
C++
1
2
3
4
5
6
template<class T> pvector<T>::pvector(const pvector& a)
{
    v.resize(a.v.size());
    for(int i = 0; i < v.size(); ++ i)
        v[i] = new T(*(a.v[i]));
}
Теперь все работает.
Выходит что дважды был использован конструктор копирования, когда передавался экземпляр класса pvector в качестве аргумента перегруженному оператору <<
Т.е. получается, что декструкторы вызываются по выходу из любой функции, использующей экземпляр в качестве аргумента? Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2014, 13:05
Ответы с готовыми решениями:

phead->nblockuse
помогите нейтрализовать ошибку. есть структура struct tim{ WORD wMonth; WORD wDay; WORD...

Expression block type is valid при освобождении памяти и access violation
Всем доброго времени суток. Я пытаюсь написать собственный класс вектор, и возникло несколько...

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Нужна помощь гуру. Искать ошибку тут в коде ненужно, сам все нашёл, мне нужно объяснение почему...

Ошибка pHead->nBlockUse
После выполнения программы выскакивает ошибка. Почитал на форумах, что проблема или в деструкторе...

1
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
15.10.2014, 19:45 2
Цитата Сообщение от Sharknado Посмотреть сообщение
Т.е. получается, что декструкторы вызываются по выходу из любой функции, использующей экземпляр в качестве аргумента?
при передаче по значению - да
0
15.10.2014, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 19:45
Помогаю со студенческими работами здесь

Ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Здравствуйте. Я работаю с таким кодом. При выполнении строк 92-107 программа выдаёт окно с...

Деструктор и _Block_Type_Is_Valid (pHead->nBlockUse)
Приветствую! Встретился сегодня с такой проблемой. Есть функция, которая возвращает объект. При...

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Ребят, умоляю помогите. Незнаю что я опять делаю не так, но выдает такую ошибку. В общем задание...

Ошибка при освобождении памяти (block type is valid) и неправильный вывод структуры данных
Доброго времени суток. У меня есть класс вектор для реализации длинной арифметики. Возникли...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru