Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::map, Debug Assertation failed и деструкторы 
V
    Опции темы
ANTON_AL
Дата 27.1.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброе время суток!

Имею код, эквивалентный следующему:

Код

#include <iostream>
#include <conio.h>
#include <map>
using namespace std;


class SomeClass
{
    public:
        SomeClass( )    { m_iArray = new int[10];    }
        ~SomeClass( )    {/* delete [ ] m_iArray;*/    }
        
        void operator == ( SomeClass *rhs )    { this->m_i == rhs->m_i;           }
        bool operator < ( SomeClass *rhs )    { return (this->m_i < rhs->m_i); }
        bool operator > ( SomeClass *rhs )    { return (this->m_i > rhs->m_i); }


    private:
        int *m_iArray;
        int m_i;
};



void main( )
{
    SomeClass theClass;
    
    map< int, SomeClass, less<int> > Map;
    Map[1] = theClass;  //Here i cause an error =(

    cout << "OK";
    getch( );
}


Если раскомментировать тело в деструкторе, то выскачет Debug Assertation Failed.
Как с этим бороться, и из за чего мапу не нравится удаление массива в деструкторе класса?

Заранее спасибо  за помощь.
С уважением, Антон!

Это сообщение отредактировал(а) ANTON_AL - 27.1.2007, 18:31
PM MAIL   Вверх
Damarus
Дата 27.1.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(ANTON_AL @  27.1.2007,  18:30 Найти цитируемый пост)
void operator == ( SomeClass *rhs )    { this->m_i == rhs->m_i;           }
bool operator < ( SomeClass *rhs )    { return (this->m_i < rhs->m_i); }
bool operator > ( SomeClass *rhs )    { return (this->m_i > rhs->m_i); }

Тут так надо, ИМХО:

Код
bool operator == (const SomeClass& rhs) { return m_i == rhs.m_i; }
bool operator < (const SomeClass& rhs) { return m_i < rhs.m_i; }
bool operator > (const SomeClass& rhs) { return m_i > rhs.m_i; }


Цитата(ANTON_AL @  27.1.2007,  18:30 Найти цитируемый пост)
Если раскомментировать тело в деструкторе, то выскачет Debug Assertation Failed.Как с этим бороться, и из за чего мапу не нравится удаление массива в деструкторе класса?

Надо написать нормальный конструктор копирования и оператор присваивания.

Это сообщение отредактировал(а) Damarus - 27.1.2007, 19:08
PM MAIL ICQ Jabber   Вверх
ANTON_AL
Дата 27.1.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Damarus

Всё это я уже делал, не помогает...
PM MAIL   Вверх
Damarus
Дата 27.1.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(ANTON_AL @  27.1.2007,  19:00 Найти цитируемый пост)
Всё это я уже делал, не помогает...

Это:
Цитата(Damarus @  27.1.2007,  18:49 Найти цитируемый пост)
Надо написать нормальный конструктор копирования и оператор присваивания.

Делал smile И не помогает smile Не верю:
Код
#include <iostream>
#include <map>
#include <conio.h>

using namespace std;

class SomeClass
{
public:
    SomeClass(void) 
    {
        m_iArray = new int[10]; 
    }
    ~SomeClass(void) 
    { 
        delete[] m_iArray; 
    }
    SomeClass(const SomeClass& src) 
    {
        m_iArray = new int[10]; 
        memcpy(m_iArray, src.m_iArray, 10 * sizeof(int));
        m_i = src.m_i;
    }

    bool operator == (const SomeClass& rhs) { return m_i == rhs.m_i; }
    bool operator < (const SomeClass& rhs) { return m_i < rhs.m_i; }
    bool operator > (const SomeClass& rhs) { return m_i > rhs.m_i; }
    SomeClass& operator = (const SomeClass& src)
    {
        delete[] m_iArray;
        m_iArray = new int[10];
        memcpy(m_iArray, src.m_iArray, 10 * sizeof(int));
        m_i = src.m_i;
        return *this;
    }

private:
    int *m_iArray;
    int m_i;
};



void main( )
{
    SomeClass theClass;

    map< int, SomeClass, less<int> > Map;
    Map[1] = theClass;  //Here i cause an error =(

    cout << "OK";
    getch( );
}


Это сообщение отредактировал(а) Damarus - 27.1.2007, 19:36
PM MAIL ICQ Jabber   Вверх
Lotrex
Дата 27.1.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: 2
Всего: 3



Привет, Антон!

Вы какой компилятор используете?
Пока что у меня откомпилировалось в MinGW с оптимизацией и без, и все отлично работает.
PM MAIL ICQ   Вверх
ANTON_AL
Дата 27.1.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Код эволюционировал вот в такой, теперь выдаёт ошибку:
"Error C2558: No copy constructur aviable"
 smile 

Код

#include <iostream>
#include <conio.h>
#include <map>
using namespace std;


class SomeClass
{
    public:
        SomeClass( )    { m_iArray = new int[10];    }
        ~SomeClass( )    {/* delete [ ] m_iArray;*/    }
        SomeClass( SomeClass &rhs )
        {
            m_iSize = rhs.m_iSize;
            
            delete [ ] m_iArray;
            m_iArray = new int[rhs.m_iSize];
            memcpy( m_iArray, rhs.m_iArray, rhs.m_iSize * sizeof(int) );
        }

        SomeClass& operator =  ( SomeClass &rhs )
        {
            m_iSize = rhs.m_iSize;
            
            delete [ ] m_iArray;
            m_iArray = new int[rhs.m_iSize];
            memcpy( m_iArray, rhs.m_iArray, rhs.m_iSize * sizeof(int) );

            return *this;
        }

        void operator == ( SomeClass &rhs )    { this->m_iSize == rhs.m_iSize;            }
        bool operator <  ( SomeClass &rhs )    { return (this->m_iSize < rhs.m_iSize); }
        bool operator >  ( SomeClass &rhs )    { return (this->m_iSize > rhs.m_iSize); }


    private:
        int *m_iArray;
        int m_iSize;
};



void main( )
{
    SomeClass theClass;
    
    map< int, SomeClass, less<int> > Map;
    Map[1] = theClass;

    cout << "OK";
    getch( );
}


В чём тут дело ??

Добавлено @ 19:16 
Средство разработки: Visual Studio 2005.
А вот как компилятор посмотреть, не знаю...

Добавлено @ 19:22 
Lotrex

Средство разработки Visual Studio 2005
А как посмотреть информацию про компилятор ??

Damarus
Что то я не понимаю, у меня и у вас код идентичный, но у меня выдаёт ошибку..., может я что то не замечаю...
PM MAIL   Вверх
Damarus
Дата 27.1.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(ANTON_AL @  27.1.2007,  19:14 Найти цитируемый пост)
"Error C2558: No copy constructur aviable"

Ещё раз:
Код
SomeClass(const SomeClass& src)

Цитата(ANTON_AL @  27.1.2007,  19:14 Найти цитируемый пост)
16: delete [ ] m_iArray;

Это зачем smile Под m_iArray память ещё не выделили smile 
Цитата(ANTON_AL @  27.1.2007,  19:14 Найти цитируемый пост)
m_iArray = new int[rhs.m_iSize];

Не понятно. В конструкторе ведь m_iArray = new int[10];. Тогда и тут ставь m_iArray = new int[10];

Добавлено @ 19:24 
Цитата(ANTON_AL @  27.1.2007,  19:14 Найти цитируемый пост)
Что то я не понимаю, у меня и у вас код идентичный, но у меня выдаёт ошибку..., может я что то не замечаю...

Ты не замечаешь const smile 
PM MAIL ICQ Jabber   Вверх
ANTON_AL
Дата 27.1.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Damarus
Ах мамочки мои!!... const. smile

Добавлено @ 19:26 
 smile Забавно, вы отвечаете быстрее, чем я пишу. smile 
PM MAIL   Вверх
Lotrex
Дата 27.1.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: 2
Всего: 3



Антон, Ваш код в MS Visual C 6.0 у меня тоже вызывает ошибку "Assertion Filed"

Код Damarus в MS Visual C 6.0  фурыкает без проблем (пока что).
Так что делайте конструктор копирования :-) и все будет чики-пики.

И еще - у Вас в конструкторе копирования параметром должна быть не просто ссылка, а константная ссылка. Из-за этого компилер и матюгается скорей всего.

PM MAIL ICQ   Вверх
Damarus
Дата 27.1.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Да ещё. Тут:
Цитата(Damarus @  27.1.2007,  19:09 Найти цитируемый пост)
SomeClass& operator = (const SomeClass& src)

delete[] естественно нужен:
Код
SomeClass& operator = (const SomeClass& src)
{
    delete[] m_iArray;
    m_iArray = new int[10];
    memcpy(m_iArray, src.m_iArray, 10 * sizeof(int));
    m_i = src.m_i;
    return *this;
}


Добавлено @ 19:36 
Пост от 27.1.2007 19:09 исправил.
PM MAIL ICQ Jabber   Вверх
ANTON_AL
Дата 27.1.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Cпасибо большое, ребята.....
Вы отвечаете быстрее, чем я задаю вопросы  smile 

Это сообщение отредактировал(а) ANTON_AL - 27.1.2007, 19:39
PM MAIL   Вверх
ANTON_AL
Дата 27.1.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Damarus 
Тут ещё проблемка возникла, если я хочу в конструкторе пересоздать массив, вылетает ошибка.

Код

#include <iostream>
#include <map>
#include <conio.h>

using namespace std;





class SomeClass
{
    public:
        SomeClass(void)    { m_iArray = new int[10];    }
        ~SomeClass(void)    { delete[] m_iArray;            }
        
        SomeClass(const SomeClass& src) 
        {
            delete[] m_iArray;    //<--Корень зла =)
            m_iArray = new int[10]; 
            memcpy(m_iArray, src.m_iArray, 10 * sizeof(int));
            m_i = src.m_i;
        }

        bool operator == (const SomeClass& rhs)    { return m_i == rhs.m_i;    }
        bool operator  < (const SomeClass& rhs)    { return m_i < rhs.m_i;        }
        bool operator  > (const SomeClass& rhs)    { return m_i > rhs.m_i;        }
        SomeClass& operator = (const SomeClass& src)
        {
            m_iArray = new int[10];
            memcpy(m_iArray, src.m_iArray, 10 * sizeof(int));
            m_i = src.m_i;
            return *this;
        }


    private:
        int *m_iArray;
        int m_i;
};



void main( )
{
    SomeClass theClass;
     SomeClass theClass2;
    
     theClass = theClass2;    //It's OK


    map< int, SomeClass, less<int> > Map;    
    Map[1] = theClass;    // =(


    cout << "OK";
    getch( );
}


 smile 

Это сообщение отредактировал(а) ANTON_AL - 27.1.2007, 22:49
PM MAIL   Вверх
Damarus
Дата 27.1.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(ANTON_AL @  27.1.2007,  22:47 Найти цитируемый пост)
Тут ещё проблемка возникла, если я хочу в конструкторе пересоздать массив, вылетает ошибка.

В конструкторе не надо пересоздавать массив, т.к. на этот момент массив ещё не создан, и, соотверственно, удалять нечего.
PM MAIL ICQ Jabber   Вверх
ANTON_AL
Дата 27.1.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Этот конструктор может ведь вызваться для уже истанцированного объекта ?? Что тогда, если я попытаюсь выполнить строку 53 ??
theClass = theClass2;    //It's OK
Мне же надо каким то макаром перекинуть массив из правого класса в левый....

Это сообщение отредактировал(а) ANTON_AL - 29.1.2007, 15:20
PM MAIL   Вверх
nickless
Дата 28.1.2007, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(ANTON_AL @ 27.1.2007,  22:46)
Этот конструктор может ведь вызваться для уже истанцированного объекта ??

Нет, конструкторы вызываются только при инициализации.

Цитата(ANTON_AL @ 27.1.2007,  22:46)
theClass = theClass2;    //It's OK

Тут вызовется оператор присваивания (operator=)


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.