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

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

Войти
Регистрация
Восстановить пароль
 
 
Supernatural
287 / 143 / 28
Регистрация: 22.11.2010
Сообщений: 1,502
#1

Правильно ли реализовано удаление элемента из массива и совершен вызов деструктора? - C++

20.06.2014, 20:53. Просмотров 671. Ответов 19
Метки нет (Все метки)

я ведь правильно определил удаление элемента из массива и совершил вызов деструктора?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ECM
{
.....
}
ECM *pECM[100];
....
void ECM::~ECM()
{
cout<<"Удален";
}
void main()
{
pECM[i]->~ECM();//удалить i-тый элемент
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2014, 20:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильно ли реализовано удаление элемента из массива и совершен вызов деструктора? (C++):

Вызов деструктора [удаление через указатель] - C++
class A: public B { public: A() {} ~A() {std::cout &lt;&lt; &quot;del&quot;;} void someFn(A*); void someFn2(); }; void someFn(A*...

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

Вызов деструктора - C++
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5310 / 4630 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
20.06.2014, 20:56 #2
Разве там не delete нужно использовать, если у тебя указатели?
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,241
Записей в блоге: 3
Завершенные тесты: 1
20.06.2014, 20:59 #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Supernatural Посмотреть сообщение
pECM[i]->~ECM();//удалить i-тый элемент
во-первых, массив не инициализирован, во-вторых, всё зависит от того как выделялась память под объекты
Supernatural
287 / 143 / 28
Регистрация: 22.11.2010
Сообщений: 1,502
20.06.2014, 21:03  [ТС] #4
ах-да и забыл:
C++
1
2
3
4
ECM::~ECM()                     //удалить объект
{
 
}
реализация деструктора

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
во-первых, массив не инициализирован, во-вторых, всё зависит от того как выделялась память под объекты
у меня вроде все работает, кроме удаления элемента. Я выделил память, просто привел лишь отдельный фрагмент кода

Добавлено через 1 минуту
во-вторых, всё зависит от того как выделялась память под объекты
через new, хотя значит я просто не дописал процедуру удаления

Добавлено через 1 минуту
я только не пойму, деструктор в определении остается пустым или туда все же надо вписывать команду delete?
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,241
Записей в блоге: 3
Завершенные тесты: 1
20.06.2014, 21:04 #5
Цитата Сообщение от Supernatural Посмотреть сообщение
Я выделил память, просто привел лишь отдельный фрагмент кода
от того как выделили зависит и как уничтожать.
Supernatural
287 / 143 / 28
Регистрация: 22.11.2010
Сообщений: 1,502
20.06.2014, 21:09  [ТС] #6
чуть-чуть недопонимаю, скидываю код. Где и что должно быть написано?
Кликните здесь для просмотра всего текста
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <vcl.h>
#include <iostream.h>
#include <string.h>
#pragma hdrstop
#pragma argsused
using namespace std;
//------------------------------------------------------------------------------
string stemporary;  //ãëîáГ*ëüГ*ûå âðåìåГ*Г*ûå ïåðåìåГ*Г*ûå
int itemporary;
float ftemporary;
float fftemporary;
string com;
int i=0;
//------------------------------------------------------------------------------
class ECM
{
char* type;
float Ghz;
int Memory;
float Gb;
public:
ECM(); //ГЄГ®Г*ñòðóêòîð ГЎГҐГ§ ГЇГ*Г°Г*ìåòðîâ
ECM(char* TYPE,float GHZ,int MEMORY,float GB);//ГЄГ®Г*ñòðóêòîð Г± ГЇГ*Г°Г*ìåòðГ*ìè
ECM(const ECM&); //ГЄГ®Г*ñòðóêòîð êîïèðîâГ*Г*ГЁГї
~ECM();          //äåñòðóêòîð
//------------------------------------------------------------------------------
void settype(char* temp);   //ГґГіГ*êöèè äëÿ êîìГ*Г*äû  Г€Г§Г¬ГҐГ*ГЁГІГј
void setghz(float temp);
void setmemory(int temp);
void setgb(float temp);
void show();
//------------------------------------------------------------------------------
char* gettypecpu();         //ГґГіГ*êöèè äëÿ êîìГ*Г*äû  ГЏГ®ГЄГ*Г§Г*ГІГј
float getghz();
int getmemory();
float getgb();
};
//------------------------------------------------------------------------------
void ECM::settype(char* temp)   //ГіГ±ГІГ*Г*îâèòü ГІГЁГЇ ïðîöåññîðГ*
{
type=temp;
}
//------------------------------------------------------------------------------
void ECM::setghz(float temp)    //ГіГ±ГІГ*Г*îâèòü Г·Г*ñòîòó ïðîöåññîðГ*
{
Ghz=temp;
}
//------------------------------------------------------------------------------
void ECM::setmemory(int temp)   //ГіГ±ГІГ*Г*îâèòü îáúåì ГЇГ*ìÿòè
{
Memory=temp;
}
//------------------------------------------------------------------------------
void ECM::setgb(float temp)     //ГіГ±ГІГ*Г*îâèòü îáúåì Г*Г*êîïèòåëÿ
{
Gb=temp;
}
//------------------------------------------------------------------------------
ECM::~ECM()                     //óäëèòü îáúåêò
{
 
}
//------------------------------------------------------------------------------
ECM::ECM(char* TYPE,float GHZ,int MEMORY,float GB) //ГЄГ®Г*ñòðóêòîð Г± ГЇГ*Г°Г*ìåòðГ*ìè
{
type=TYPE;
Ghz=GHZ;
Memory=MEMORY;
Gb=GB;
}
//------------------------------------------------------------------------------
ECM::ECM(){ //ГЄГ®Г*ñòðóêòîð ГЎГҐГ§ ГЇГ*Г°Г*ìåòðîâ
type=NULL;
Ghz=0;
Memory=0;
Gb=0;
}
//------------------------------------------------------------------------------
ECM::ECM(const ECM &E)   //ГЄГ®Г*ñòðóêòîð êîïèðîâГ*Г*ГЁГї
{
if (E.type) {type= new char [strlen(E.type)+1]; strcpy(type, E.type);}
else type=0;
type=E.type;Ghz=E.Ghz;Memory=E.Memory;Gb=E.Gb;
}                       
//------------------------------------------------------------------------------
char* ECM::gettypecpu() {return type;}
float ECM::getghz() {return Ghz;}
int ECM::getmemory() {return Memory;}
float ECM::getgb() {return Gb;}
void add_element();
void edit_element(int i);
void show_element(int i);
void copy_element(int i);
void delete_element(int i);
void show_all();
//------------------------------------------------------------------------------
ECM *pECM[100];
//------------------------------------------------------------------------------
void add_element() //ïðîöåäóðГ* äîáГ*âëåГ*ГЁГї
{
++i;
cout<<"\nCPU ";cin>>stemporary;
char* ctemporary = new char [stemporary.length()+1];
strcpy(ctemporary,stemporary.c_str());
cout<<"\nGhz ";cin>>ftemporary;
cout<<"\nMemory ";cin>>itemporary;
cout<<"\nGb ";cin>>fftemporary;
pECM[i]= new ECM(ctemporary,ftemporary,itemporary,fftemporary);//Г*îâûé ýëåìåГ*ГІ
}
//------------------------------------------------------------------------------
void edit_element(int i)
{
 
}
//------------------------------------------------------------------------------
void delete_element(int i)  //ГіГ¤Г*ëèòü ýëåìåГ*ГІ
{
pECM[i]->~ECM();
cout<<"\nElement has been deleted";
}
//------------------------------------------------------------------------------
void show_element(int i)   //ïîêГ*Г§Г*ГІГј ýëåìåГ*ГІ
{
cout<<pECM[i]->gettypecpu()<<" "<<pECM[i]->getghz()<<" "<<pECM[i]->getmemory()<<" "<<pECM[i]->getgb();
}
//------------------------------------------------------------------------------
void show_all()            //ïîêГ*Г§Г*ГІГј ГўГҐГ±Гј ñïèñîê
{
for (int k=0;k<i;k++)
cout<<pECM[k]->gettypecpu()<<" "<<pECM[k]->getghz()<<" "<<pECM[k]->getmemory()<<" "<<pECM[k]->getgb();
}
//------------------------------------------------------------------------------
void main()
{
int i;
int temp;
cout<<"Enter command: ";cin>>com;
while (com!="exit")
{
if (com=="add") {add_element();cout<<"\nEnter command: ";cin>>com;} else
if (com=="edit") {cin>>i;edit_element(i);cout<<"\nEnter command: ";cin>>com;} else
if (com=="delete") {cout<<"\nEnter number of record";cin>>temp;delete_element(temp);cout<<"\nEnter command: ";cin>>com;} else
if (com=="show") {cout<<"\nEnter number of record";cin>>temp;show_element(temp);cout<<"\nEnter command: ";cin>>com;} else
if (com=="show all") {show_all;cout<<"\nEnter command: ";cin>>com;} else
if (com=="exit") exit (EXIT_SUCCESS); else
if ((com!="add")||(com!="edit")||(com!="delete")||(com!="show")||(com!="show all")||(com!="exit")) {cout<<"\nEnter command: ";cin>>com;};
}
}
//---------------------------------------------------------------------------
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,241
Записей в блоге: 3
Завершенные тесты: 1
20.06.2014, 21:16 #7
C++
1
2
3
4
5
void delete_element(int i)  //удалить элемент
{
delete pECM[i] ;//Деструктор вызовется без вашего участия.
cout<<"\nElement has been deleted";
}
Supernatural
287 / 143 / 28
Регистрация: 22.11.2010
Сообщений: 1,502
20.06.2014, 22:05  [ТС] #8
Croessmah, хорошо, а в каких случаях мне можно использовать конструктор без параметра? С параметром уже разобрался.
Trwsdf
Заблокирован
20.06.2014, 22:22 #9
Цитата Сообщение от Supernatural Посмотреть сообщение
ECM *pECM[100];
100 указателей на объект ))) круто

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ECM
{
public:
    ~ECM();
};
ECM *pECM=nullptr;
 
ECM::~ECM()
{
std::cout<<"Удален";
};
 
int main(int argc, char** argv) {
 
    pECM =new ECM[100];
    delete[] pECM;
Указателей на массив не существует, существуют только указатель на один элемент массива.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.06.2014, 14:42 #10
Цитата Сообщение от Trwsdf Посмотреть сообщение
Указателей на массив не существует, существуют только указатель на один элемент массива.
C++
1
2
3
4
5
6
7
8
int main() {
 
    const int N = 42;
    int a[N];
    int (*p)[N] = &a;
 
    return 0;
}
p - указатель на массив из N элементов типа int.
Trwsdf
Заблокирован
22.06.2014, 16:26 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Код C++
1
2
3
4
5
6
7
8
int main() {
const int N = 42;
 int a[N];
 int (*p)[N] = &a;
return 0;
}
p - указатель на массив из N элементов типа int
.
Теперь вы окончательно укоренили мне мнение о вас, о вашей безграмотности.
Вы так и не поняли, что указателей на массив не существует, существует, только указатели на один элемент массива, их то мы и считаем указателями на массив.
Попытаюсь повторить, но судя с ответов предыдущей темы, ожидаю, что автор и тут будет агрессивно настроен.

То, что вы написали, это указатель на указатель на 1й элемент массива, т.е. есть массив в виде указателя на 1й элемент массива (о чем я писал выше), а есть указатель на этот указатель, - он и является указателем на массив. Т.е. массив в виде указателя на 1й элемент массива - он и считается указателем на массив. Указатель на один элемент массива считается указателем на массив, - но реально не на весь массив, а лишь на один его элемент. Указателей на массив НЕТ И НЕ БЫЛО. Они и не нужны, ибо мы знаем особенность массива (что его элементы в памяти всегда и гарантированно расположены один за другим) и нам всегда хватает лишь указателя на один элемент массив. О чем я выше говорил.
Ниже код:
C++
1
2
3
4
5
6
7
8
9
10
11
 const int N = 3;
    int a[N]={1,2,3};
    
    int (*p)[N] = &a;
    //**p -указатель "на массив" есть указатель на указатель на 1й эдемент массива
    //т.е. есть указатель на массив, в виде указателя на 1й элемент, а
    //указатель на этот указатель и есть указатель на массив. Таким образом
    //эта конструкция подтверждает то, что указатель на один элемент 
    //считается указателем на массив.
    cout<<**p; //1 - указатель на один элемент массива, но не на массив из n элементов.
    cout<<(*p)[2];
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
22.06.2014, 16:37 #12
Цитата Сообщение от Trwsdf Посмотреть сообщение
Теперь вы окончательно укоренили мне мнение о вас, о вашей безграмотности.
Tulosba прав, а ты - нет. Учи теорию типов

Справедливости ради все же отмечу, что это кстати весьма распространенное забруждение
Trwsdf
Заблокирован
22.06.2014, 16:39 #13
Цитата Сообщение от Voivoid Посмотреть сообщение
Tulosba прав, а ты - нет. Учи теорию типов
Круто папка зашел и сказал, интересно он прежде чем так ответить хоть знает С++?
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
22.06.2014, 16:48 #14
Цитата Сообщение от Trwsdf Посмотреть сообщение
Круто папка зашел и сказал, интересно он прежде чем так ответить хоть знает С++?
А то!

Даже не знаю какой бы пример попроще подобрать, ну пусть будет например такой:
C++
1
2
3
4
5
6
7
8
9
10
  const int N = 42;
  const int M = 43;
 
  int a[ N ];
  int b[ M ];
 
  int( *p )[ N ] = &a;
  int( *q )[ M ] = &b;
 
  p = q;
Вывод компилятора:
error C2440: '=' : cannot convert from 'int (*)[43]' to 'int (*)[42]'
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,241
Записей в блоге: 3
Завершенные тесты: 1
22.06.2014, 20:21 #15
Цитата Сообщение от Trwsdf Посмотреть сообщение
//указатель на этот указатель и есть указатель на массив.
Характерная черта массива как типа - известность его размера и в int (*p)[3] создается именно указатель на массив определенного размера, интерпретируя его как тип. Проверим банальной перегрузкой:
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
#include <iostream>
void foo( int (*p)[5] )
{
   std::cout << "void foo( int *p[5] )" << std::endl ;
}
 
void foo( int (*p)[3] )
{
   std::cout << "void foo( int *p[3] )" << std::endl ;
}
 
void foo( int * p )
{
   std::cout << "void foo( int * p )" << std::endl ;
}
 
 
void foo( int ** p )
{
   std::cout << "void foo( int ** p )" << std::endl ;
}
int main( )
{
    int * p1 = 0 ;
    int ** p2 = 0 ;
    int (*p3)[3] = 0 ;
    int (*p4)[5] = 0 ;
    foo(p1) ;
    foo(p2) ;
    foo(p3) ;
    foo(p4) ;
}
Никаких нареканий - все указатели имеют разный тип(даже если указана разная размерность массива). Хоть массив это и просто кусок памяти, но интерпретировать его можно по разному.

P.S. Указатели не указывают на элементы массива, они указывают просто на память определенного типа, будь там указател int ** pp или "статический" массив int (*p)[N]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 20:21
Привет! Вот еще темы с ответами:

Двойной вызов деструктора - C++
Здравствуйте, уважаемые. Вот столкнулся с такой проблемой... CharRow - это класс, который содержит указатель на строку... ...

Явный вызов деструктора - C++
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Явный вызов деструктора - C++
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Повторный вызов деструктора - C++
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного объекта может вызываться...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.06.2014, 20:21
Ответ Создать тему
Опции темы

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