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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог std::vector 
:(
    Опции темы
mrgloom
Дата 31.7.2013, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вообщем есть аналог std::vector для произвольного класса(темлейтный)

код который увеличивает размер массива и копирует содержимое старого массива в больший новый
Код

    TYPE*       m_pData;            // Pointer to array data
    size_type   m_nSize;            // Number of valid data units
    size_type   m_nMaxSize;         // Number of data units memory allocated for

    bool Realloc( size_type size )
    {
        try
        {
            TYPE* p = new TYPE[size];
            if( p != NULL )
            {
                size_type copy = Min( m_nSize, size );

                for( size_type i = 0; i < copy; ++i )
                    p[i] = m_pData[i];
                if( m_pData != NULL )
                    delete[] m_pData;
                m_pData = p;
                m_nSize = copy;
                m_nMaxSize = size;
                return true;
            }
        }
        catch( const std::bad_alloc& )
        {}
        return false;
    }

тут всё нормально

но теперь представим, что у нас есть класс с указателем типа
Код

struct CMyClass
{
    int i;
    int* pi;
    CMyClass():i(0),pi(NULL)
    {}
    ~CMyClass()
    {
        if(pi!=NULL)
        {
              delete pi;
              pi=NULL;
        }
    }
}


так вот на delete[] m_pData;  вызывается деструктор CMyClass и удаляется то что по указателю pi, а потом уже получается не валидный указатель копируется.

в std:: vector делается как то подругому?
как решить проблему?  убрать всё из деструктора и удалять память по указателю pi явно в программе?
PM MAIL   Вверх
bsa
Дата 31.7.2013, 15:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



mrgloom, нет. Необходимо создать свои оператор присваивания и конструктор копирования.
PM   Вверх
mrgloom
Дата 1.8.2013, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ага.

прочитал это http://www.cplusplus.com/articles/y8hv0pDG/

но логически не понял про const
Цитата

C++ standard forbids the compiler
to pass a temporary object through a non-const reference parameter.


PM MAIL   Вверх
bsa
Дата 1.8.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



mrgloom, когда ты создаешь временный объект вызовом конструктора: CMyClass(); то его нельзя менять. Поэтому конструктор MyClass(MyClass &other) для этого не подходит. А вот MyClass(const MyClass &other) успешно примет такой объект.
Поэтому сигнатура конструктора копирования должна быть: CMyClass(const CMyClass &other);
Сигнатура оператора присваивания должна быть: MyClass& operator=(const MyClass &other);

Возможны варианты, но в этом случае ты должен ТОЧНО ЗНАТЬ ЧТО И ЗАЧЕМ ТЫ ДЕЛАЕШЬ.
PM   Вверх
mrgloom
Дата 1.8.2013, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так где я его меняю? я же просто присваиваю, т.е. использую только справа.
PM MAIL   Вверх
bsa
Дата 1.8.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



mrgloom, тут не вопрос в том, меняешь ли ты его или нет. Компилятор должен быть заранее уверен в том, что ты его не изменишь. Вот для этого const и существует. Более того, практика его игнорирования очень порочна и приводит к серьезным последствиям в больших проектах (хотя, те кто не использует const до больших проектов редко "доживают").
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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