С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 5
1

Ошибка работы деструктора

03.03.2013, 16:57. Показов 643. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Недавно начала программировать на C++, поэтому возможно жителям данного форума мой вопрос покажется сильно нубским. Тем не менее.
Имею класс
C++
1
2
3
4
5
6
7
8
class MyClass
{
private:
   int x,y,z;
public:
   MyClass(int=0;int=0;int=0);
   ~MyClass();
};
его конструктоp
C++
1
2
3
4
5
6
MyClass::MyClass(int x0, int y0, int z0)
{
x=x0;
y=y0;
z=z0;
}
деструктор
C++
1
2
3
4
5
6
MyClass::~MyClass()
{
delete &x;
delete &y;
delete &z;
}
и сам мейн, где по некоторому задаваему пользователем n создается массив из n обьектов класса примерно так
C++
1
2
3
MyClass* classes=new MyClass[n];
//а тут я вызываю деструктор
for (int i=0; i<n; i++) classes[i].~MyClass();
В итоге получаю _BLOCK_TYPE_IS_VALID (pHead->nBlockUse) при первом же вызове деструктора. Рискну предположить, что моя ошибка в отсутствии конструктора копирования, но как именно ее исправить в данной ситуации - теряюсь в догадках. Заранее спасибо за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2013, 16:57
Ответы с готовыми решениями:

Особенности работы деструктора
Есть вот такой код. Все работает.#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; ...

Программа падает во время работы деструктора
/ ConsoleApplication6.cpp: определяет точку входа для консольного приложения. // #include...

Ошибка деструктора
Имеется шаблон класса- динамического массива. После создания функции push_back начал ругаться...

Ошибка при вызове деструктора
Всем привет ! Есть класс class building { private: string *location_street;...

9
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
03.03.2013, 16:58 2
деструктор тут не нужен
delete должен удалять не только всё то, что выделялось оператором new
но и ТОЛЬКО то, и ничего больше.
0
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 5
03.03.2013, 17:00  [ТС] 3
допустим
C++
1
for (int i=0; i<n; i++) delete &classes[i];
аналогичная ошибка.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
03.03.2013, 17:06 4
деструктор не удаляет объекты. Ты не знал что ли?

Добавлено через 2 минуты
что такое classes ?
ещё раз. если у тебя в программе не нужна строчка classes[i]=new ...
то и строчка delete classes[i]; не нужна
к тому же, подозреваю, что брать & от classes вообще вредно
0
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 5
03.03.2013, 17:06  [ТС] 5
а что же он делает?
я же говорю, только начинаю использовать C++, и сильно туплю

classes - массив обьектов класса MyClass
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
03.03.2013, 17:10 6
Цитата Сообщение от sylvia Посмотреть сообщение
а что же он делает?
деинициализирует перед удалением, если можно так выразится.

Добавлено через 2 минуты
Цитата Сообщение от sylvia Посмотреть сообщение
//а тут я вызываю деструктор
А вот вызывать его ВООБЩЕ никогда не нужно.

Не по теме:

точнее иногда нужно, если ты пишешь свою перегруженную реализацию оператора delete для работы с каким-то адским самодельным менеджером памяти, например, но это редко бывает

0
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 5
03.03.2013, 17:13  [ТС] 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Добавлено через 2 минуты

А вот вызывать его ВООБЩЕ никогда не нужно.
Странно. Преподаватель советовал как раз явный вызов деструктора. Не суть.
Насчет амперсанда - если мы имеем память, выделенную под обьекты через new - как иначе нам получить адрес этой памяти?
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
03.03.2013, 17:13 8
короче, ближе к делу.
верно так!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyClass
{
private:
   int x,y,z;
public:
   MyClass(int=0;int=0;int=0);
};
MyClass::MyClass(int x0, int y0, int z0)
{
  x=x0;
  y=y0;
  z=z0;
}
int main(){
  int n=10;
  MyClass* classes=new MyClass[n];
  //.....программа
  delete[] classes;
  return 0;
}
0
0 / 0 / 0
Регистрация: 03.03.2013
Сообщений: 5
03.03.2013, 17:16  [ТС] 9
Благодарю.
Между прочем это очень интересно, мой первый вариант программы был именно таким, и препода не устроило как раз таки отсутствие деструктора.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
03.03.2013, 17:17 10
можешь добавить деструктор, но он будет абсолютно пустым, ибо не нужен.
C++
1
2
3
MyClass::~MyClass()
{
}
0
03.03.2013, 17:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2013, 17:17
Помогаю со студенческими работами здесь

Ошибка при вызове деструктора
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый...

Ошибка при вызове деструктора
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include...

Ошибка при вызове деструктора
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace...

Ошибка при вызове деструктора
Здравствуйте, помогите разобраться с проблемой, она довольно распространенная и на форуме куча...

Ошибка при вызове деструктора
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм....

Ошибка при вызове деструктора
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает непонятное окно,и...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru