crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> как протестировать оператор присваивания и конструктор копирования класса?
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 15:36
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Собственно вопрос: как протестировать класс на корректность работы самописаных конструктора копирования и оператора присваивания, и на предмет их существования вообще.

Положим, что в конструкторе класса создаётся динамический объект, а в деструкторе удаляется.

Если свои конструктора копирования и оператора присваивания не определять, то компилятор будет использовать побитовое копирование.

При этом могут возникать коварные ситуации. Как я понимаю, связанные с двойным освобождением ресурсов.

Можно ли написать код, который бы осуществлял подобный тест?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 20.4.2010, 19:12
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Я немного подправил код.... Правда, не компилировал! Только то, что бросается в глаза при чтении.
Раскрывающийся текст
#include "ybuffer1.h"

#include <QtGlobal>


YBuffer1::YBuffer1(const char *abuffer, unsigned int asize)
{
    theSize = asize;
    theBuffer = new char[asize];
    // тут надо скопировать содержимое
    // поскольку abuffer - POD, то можно не делать цикл, а тупо использовать memcpy
    // или использовать std::copy
    memcpy(theBuffer, abuffer, asize);
    // хотя можно использовать и цикл... дело вкуса, но практически всегда memcpy выполняется
    // быстрее.
/*    
    unsigned int cnt = 0;
    while(cnt != asize){
        theBuffer[cnt] = abuffer[cnt];
        cnt++;
    }
*/
}

YBuffer1::~YBuffer1()
{
    // эта ошибка приводит к UB! Стандарт, 5.3.5/2
    /* delete theBuffer; */
    delete[] theBuffer;
}

YBuffer1::YBuffer1(const YBuffer1 &other)
{
    theSize = other.size();
    theBuffer = new char[other.size()];
    // тут надо скопировать содержимое
    copy(other, *this);
}

YBuffer1& YBuffer1::operator=(const YBuffer1 &other)
{
    // 1. проверить присваивание самому себе, типа i = i;
    if (this != &other)
    {
        // 2. перед выделением нового буфера надо удалить старый.
        // Еще лучше - использовать технику, безопасную по отношению к исключениям,
        // см. Саттер, "Решение сложных задач на C++"
        delete[] theBuffer;
        
        theBuffer = new char[other.size()];
        // тут надо скопировать содержимое
        copy(other, *this);
        theSize = other.size();
    }
    return *this;
}

void YBuffer1::copy(const YBuffer1 &source, YBuffer1 &destination)
{
    unsigned int size = source.size();
    Q_ASSERT_X(size == destination.size(), "YBuffer1::copy()", "size of objects not eqal");
    memcpy(destination.theBuffer, source.theBuffer, source.size());
/*    
    unsigned int cnt = 0;
    while(cnt != size){
        destination[cnt] = source[cnt];
        cnt++;
    }
*/
}

// здесь везде i должны быть строго < theSize!
    
const char& YBuffer1::at(unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::at()", "requested index too big");
    return theBuffer[i];
}

char& YBuffer1::operator[](unsigned int i)
{
    Q_ASSERT_X(i < theSize, "YBuffer1::operator[]", "requested index too big");
    return theBuffer[i];
}

char YBuffer1::operator[](unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::operator[]", "requested index too big");
    return theBuffer[i];
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Litkevich Yuriy   как протестировать оператор присваивания и конструктор копирования класса?   20.4.2010, 15:36
- - Andrewshkovskii   http://www.devexp.ru/2010/03/o-kopirovanii-obektov...   20.4.2010, 15:52
- - Влад   Цитата(Litkevich Yuriy @ 20.4.2010, 15:36...   20.4.2010, 17:16
- - Litkevich Yuriy   я пока примитивный тест сделал (мой класс - просте...   20.4.2010, 17:41
|- - DIMEDROLL   Цитата(Litkevich Yuriy @ 20.4.2010, 17:41...   20.4.2010, 18:30
- - Влад   Гмм.... А можно взглянуть на код этого YBuffer1?   20.4.2010, 18:06
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 22:06) Гмм.... А...   20.4.2010, 18:52
|- - DIMEDROLL   ЦитатаЦитата(DIMEDROLL @ 20.4.2010, 22:30...   20.4.2010, 18:59
- - Litkevich Yuriy   Цитата(DIMEDROLL @ 20.4.2010, 22:59) не п...   20.4.2010, 19:03
|- - DIMEDROLL   Цитата(Litkevich Yuriy @ 20.4.2010, 19:03...   20.4.2010, 19:07
- - Влад   Я немного подправил код.... Правда, не компилирова...   20.4.2010, 19:12
- - Litkevich Yuriy   Цитата(DIMEDROLL @ 20.4.2010, 23:07) что ...   20.4.2010, 19:16
|- - DIMEDROLL   ЦитатаКонструктор Копирования и Оператор Присваива...   20.4.2010, 19:34
- - Влад   POD - Plain Old Data.   20.4.2010, 19:19
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 23:12) // эта ош...   20.4.2010, 19:23
- - Влад   Юрий, просто Стандарт языка (п. 5.3.5 положение (c...   20.4.2010, 21:36
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 23:12) см. Сатте...   21.4.2010, 12:57
- - AD   Цитата(Litkevich Yuriy @ 21.4.2010, 13:57...   21.4.2010, 17:48


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 6.5.2025, 4:14