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

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

Войти
Регистрация
Восстановить пароль
 
 
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
#1

Возможно ли явное разрушение объекта класса? - C++

05.07.2014, 23:43. Просмотров 749. Ответов 23
Метки нет (Все метки)

Код (класс матрицы)
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <assert.h>
using namespace std;
class MATRIX_us{
private://V
    int counter;
    int row;
    int col;
    int**p;
public://CD
    MATRIX_us(int a, int b)
    {row=a;col=b;counter=0;
     p=new int*[row];
     for(int i=0;i<row;i++)
         p[i]=new int [col];
 
     for(int i=0;i<row;i++)
         for(int j=0;j<col;j++)
         p[i][j]=(11+j)+(10*i);
         cout<<"created"<<endl;}
 
    ~MATRIX_us(){
        for(int i =0;i<row;i++)
        delete []p[i];cout<<"destroyed col"<<endl;
        delete []p;   cout<<"destroyed row"<<endl;}
public://F
    void Show(int a, int b){cout << p[a][b];cout<<endl;}
    void Set(int a, int b, int c){p[a][b]=c;}
    void ShowAll(){
     for(int i=0;i<row;i++)
         for(int j=0;j<col;j++){
             cout<<p[i][j]<<' ';counter++;
             if(counter==row){cout<<endl;counter=0;}}}};
 
 
int main() {
 
    MATRIX_us a(2,2);
           //a.~MATRIX_us();  <-- ???
    system("PAUSE");
    }

Вобщем можно ли както удалить обьект класса явно? Пытался через явный вызов деструктора(с чего и началось) но класс остался полуживой.Компилятор может дальше использовать методы класса не ругаясь.
По завершению програмы вылетает:
Необработанное исключение по адресу 0x5EAE7508 (msvcr110d.dll) в удаляй1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEE2.
Без понятия что это, но явно чтото не ок. Вобщем не получаетсо. Зачем тогда предусмотрен явный вызов деструктора?

И еще интересно тот же вопрос про указатель:
1)Как инициализированый ранее указатель явно привести в нерабочюю форму (типа начального *ptr=NULL можно ли так после инициализации делать?)
2)Как удалить его.

Насколько я понимаю все обьекты/переменные/функции созданые в main идут на стек но как их оттуда удалять явно?(аля new/delete)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2014, 23:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно ли явное разрушение объекта класса? (C++):

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Создание и разрушение объектов класса, исследование вызовов конструкторов и деструкторов - C++
Здравствуйте! Проверте пожалуйста код и подскажите мои ошибки. Согласно теме необходимо разобрать класс библиотека(имя – char*, автор –...

Объявление объекта класса fstream в качестве статической компоненты другого класса - C++
Доброго времени суток. Есть задание, в котором говорится &quot;...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...

Проверка создания объекта класса BBB из класса AAA и работа с ним - C++
#define @param2; // объявили для выяснения случая: нужен новый или использовать существующий. Class AAA { private: void...

Создание объекта класса с полем являющимся объектом другого класса - C++
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

23
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
06.07.2014, 00:47  [ТС] #16
gray_fox я несовсем понимаю чем этот вариант отличаеться от начального обычного деструктора. В чем отличие результата?

DrOffset вот какраз этого и хотелось бы... Но я надеялся на более простой способ
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
06.07.2014, 00:53 #17
Цитата Сообщение от TierX Посмотреть сообщение
[gray_fox я несовсем понимаю чем этот вариант отличаеться от начального обычного деструктора. В чем отличие результата?
Отличается тем, что есть отдельный метод для деинициализации; можно было бы всё сделать в деструкторе, но в С++ не принято вызывать деструктор явно (кроме особых случаев). Но лучше (ИМХО) так не делать, а последовать советам из последнего поста DrOffset.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
06.07.2014, 01:46 #18
Цитата Сообщение от TierX Посмотреть сообщение
gray_fox я несовсем понимаю чем этот вариант отличаеться от начального обычного деструктора.
Как уже сказал DrOffset, в С++ нет сборщика мусора, который отслеживает ссылки и вызывает деструктор когда живых ссылок уже нет.
В методе деинициализации от gray_fox, происходит проверка указателя и сбрасывание его в ноль. То есть при повторном вызове деструктора он ничего на объекте делать не будет. За эту безопасность придётся платить временем на проверку.
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
06.07.2014, 01:47  [ТС] #19
вобщем я пока вижу только 1 вариант это крепить обектты на указатель через new. чтобы потом хоть указатель и останеться но обьект можно было удалить.

Если еще кстати ктото тут будет вот например так
C++
1
MATRIX_us *p= new MATRIX_us (2,2);
понятно что все переменные/функции обьекта будут созданы в динамической памяти благодоря new. Но в самом обьекте конструктор выделяет таким же new память для значений переменных строк и столбцов.
Собсно ничо в такой круговой поруке нету страшного ?) Просто сам клас будет в одной области храниться, а для переменных в самом классе выделиться другая область. И ничего страшного да?)
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
06.07.2014, 02:00 #20
Цитата Сообщение от TierX Посмотреть сообщение
Собсно ничо в такой круговой поруке нету страшного ?)
Ничего страшного, new просто выделяет в куче свободный участок памяти и вызывает конструктор, главное позже обеспечить соответствующий вызов delete (но с этим могут быть неудобства\проблемы, например если так же используются исключения). Вообще в "современном" С++ принято сводить ручное управление ресурсами к минимуму.
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
06.07.2014, 02:01  [ТС] #21
что конкретно проверяет if(p) ? сщесвтвует ли он? инициализирован чемто?

Да но помоему подругому(проще) реализовать клас матрицы в динамической памяти нельзя.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
06.07.2014, 02:07 #22
Цитата Сообщение от TierX Посмотреть сообщение
вобщем я пока вижу только 1 вариант это крепить объекты на указатель через new.
Может быть стоит разобраться с идеологий С++?
Пока что, как мне кажется, здесь больше твое непонимание играет, чем какие-то реальные проблемы.
Выделять абсолютно всю память в динамической памяти может быть очень накладно.

Добавлено через 1 минуту
Цитата Сообщение от TierX Посмотреть сообщение
что конкретно проверяет if(p) ?
Проверяет неравенство нулю.
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
06.07.2014, 02:13 #23
Цитата Сообщение от TierX Посмотреть сообщение
Да но помоему подругому(проще) реализовать клас матрицы в динамической памяти нельзя.
Вообще, если отвлечься, внутри класса лучше бы выделять один массив размером rows * collumns, а не массив указателей на массивы...
2
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
06.07.2014, 02:29  [ТС] #24
Тут больше не идеалогия а правильная архитектура создания/хранения обьектов. Мне пока не известна альтернатива new в этом плане. Да и вобще архитектура программ для меня это пока попаболь ) думаю в скором времени повторить попытку второго тома Эккеля осилить может там научусь этому.(Философия C++. Практическое программирование.)

Добавлено через 6 минут
Да про одномерный масив согласен

Добавлено через 59 секунд
Спасибо вам еще раз добрые люди.
0
06.07.2014, 02:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2014, 02:29
Привет! Вот еще темы с ответами:

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...


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

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

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