![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Litkevich Yuriy |
![]()
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Собственно вопрос: как протестировать класс на корректность работы самописаных конструктора копирования и оператора присваивания, и на предмет их существования вообще.
Положим, что в конструкторе класса создаётся динамический объект, а в деструкторе удаляется. Если свои конструктора копирования и оператора присваивания не определять, то компилятор будет использовать побитовое копирование. При этом могут возникать коварные ситуации. Как я понимаю, связанные с двойным освобождением ресурсов. Можно ли написать код, который бы осуществлял подобный тест? |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
я пока примитивный тест сделал (мой класс - простенький буфер):
1) проверяем правильность копирования (идентичность копии) 2) модифицируем исходный буфер, новый не должен поменяться 3) модифицируем новый буфер, исходный не должен поменяться Если я закоментирую оператор присваивания и конструктор копирования, два последних теста не проходят (как и ожидалось). Код весь находится в функции main и выглядит примерно так: Т.е. я ограничил область видимости каждого теста фигурными скобками, и полагал, что по выходу за эти скобки, программа должна аварийно завершатся при отсутствии собственных конструктора копирования и оператора присваивания. Но программа падает почему-то после всех тестов, а не когда произойдёт выход за фигурные скобки.
|
|
|
DIMEDROLL |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: ![]() ![]() ![]() |
я пока примитивный тест сделал (мой класс - простенький буфер): я бы поступил так: - Для классов которые не должны копироваться использую DISALLOW_COPY_AND_ASSIGN - Для копируемых темплейтная фукция:
Весь код проверки находится в операторе сравнения(==). Для каждого класса не надо писать свою функцию теста, просто реализовать ==. В реализации == обязательно проверять указатели на равенство. Например
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 6:09 |