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

Двойной вызов деструктора

01.12.2016, 19:37. Показов 749. Ответов 8
Метки нет (Все метки)

Здравствуйте, уважаемые. Вот столкнулся с такой проблемой...

CharRow - это класс, который содержит указатель на строку...

C++
1
2
3
4
5
6
7
    CharRow row(4);
    CharRow row2(3);
 
    cin >> row;
    cin >> row2;
 
    CharRow temp = row - row2;
После данного кода программа попадает в operator- (), который удаляет подстроку из строки и возвращает CharRow, который содержит результат этого удаления.
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
    CharRow CharRow::operator- (CharRow& row2)
    {
        int row1Length = this->getRowCurrentLength();
        int row2Length = row2.getRowCurrentLength();
 
        CharRow tempRow(row1Length - row2Length);
 
        char source[row1Length];
 
        for(int i = 0; i < row1Length; i++){
            source[i] = this->ptr[i];
        }
 
        char* tmpStr;
 
        tmpStr = strstr(source, row2.ptr);
 
        //if row2 is not substring for row1
        if(tmpStr == NULL){
            return *this;
        }
 
        strcpy(tmpStr, tmpStr + row2Length);
 
            for(int i = 0; i < row1Length - row2Length;i++){
             tempRow.ptr[i] = source[i];
         }
 
        return tempRow;
    }
и вот после operator- () деструктор вызываеться 2 раза подряд.

Как я понимаю, из-за того, что обьект CharRow возвращается по значению, то для него вызывается сначала CopyConstructor, а затем деструктор для очистки памяти. Но для чего деструктор вызываеться 2 раз ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2016, 19:37
Ответы с готовыми решениями:

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

Вызов деструктора
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo...

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять...

8
Любитель чаепитий
3734 / 1793 / 563
Регистрация: 24.08.2014
Сообщений: 5,998
Записей в блоге: 1
01.12.2016, 19:57 2
Цитата Сообщение от Andrewnech Посмотреть сообщение
Но для чего деструктор вызываеться 2 раз ?
Покажите больше кода. Что у Вас после CharRow temp = row - row2;?
0
0 / 3 / 3
Регистрация: 17.12.2013
Сообщений: 64
01.12.2016, 20:04  [ТС] 3
GbaLog-, Да ничего, программа ломаеться на строке
C++
1
CharRow temp = row - row2;
И проблема в том, что после
C++
1
       return tempRow;
Идет вызов деструктора, который удаляет ptr, а затем вызываеться снова деструктор, который пытаеться удалить этот же самый ptr...
0
Любитель чаепитий
3734 / 1793 / 563
Регистрация: 24.08.2014
Сообщений: 5,998
Записей в блоге: 1
01.12.2016, 20:33 4
Цитата Сообщение от Andrewnech Посмотреть сообщение
который удаляет ptr
А ptr это что?
0
0 / 3 / 3
Регистрация: 17.12.2013
Сообщений: 64
01.12.2016, 20:39  [ТС] 5
GbaLog-, Указатель на char. Вот header класса :

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
class CharRow{
 
protected:
    char* ptr;
    int ROW_MAX_LENGTH;
 
public:
    //Constructors
    CharRow(int);
    CharRow();
    //Copy Constructor
    CharRow(const CharRow &);
 
    //methods
    void fillRow(char);
    void printRow();
    virtual void enterRowFromKeyboard();
    int getRowMaxLength();
    int getRowCurrentLength();
    void setSymbol(int index, char symbol);
    void printSeparator();
 
    //overloaded operators
    virtual CharRow operator+ (CharRow& row2); //concatenate two rows
    CharRow operator- (CharRow& row2); //delete one row from another
    bool operator* (CharRow& row2); //check entry one row in another
    virtual CharRow operator= (CharRow& row2);
 
    //friends operators for stream
     friend void operator<< (std::ostream &os, CharRow &row);
     friend void operator>> (std::istream &os,CharRow &row);
 
    //Destructor
    virtual ~CharRow();
};
0
16471 / 8969 / 2200
Регистрация: 30.01.2014
Сообщений: 15,576
01.12.2016, 22:30 6
Andrewnech, а реализацию конструктора копирования посмотреть можно?
0
0 / 3 / 3
Регистрация: 17.12.2013
Сообщений: 64
01.12.2016, 23:35  [ТС] 7
DrOffset, Да я уже разобрался
0
DrOffset
01.12.2016, 23:49
  #8

Не по теме:

Цитата Сообщение от Andrewnech Посмотреть сообщение
Да я уже разобрался
Ясное дело, код-то ты нормально не показал :)
Никто кроме тебя (и телепатов) не смог бы разобраться...

0
GbaLog-
02.12.2016, 09:38     Двойной вызов деструктора
  #9

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
а реализацию конструктора копирования посмотреть можно?
Опередили, ну я так и думал, что где-то там загвоздка. :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2016, 09:38

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

Не понятный вызов деструктора
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды...

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

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


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

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

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