Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
rikimaru2013
C++ Game Dev
2350 / 1056 / 232
Регистрация: 30.11.2013
Сообщений: 3,500
#1

Incomplite type delete - C++

19.11.2015, 17:58. Просмотров 210. Ответов 3
Метки нет (Все метки)

Добрый вечер,

пытаюсь постичь смысл UB стандарта
if the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.

Github source: here
Таблетка от UB:
C++
1
2
3
4
5
 
~scoped_ptr() {
    enum { type_must_be_complete = sizeof(C) };
    delete ptr_;
  }
Пример:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
class A;
class B
{
private:
    A* m_ptr;
public:
    void f()
    {
        //enum { type_must_be_complete = sizeof(A) };
        delete m_ptr;
    }
};
 
 
int main()
{
    B b;
    b.f();
}





Тобишь при delete ptr_; компилятор не тратит ресурсы на проверку "завершенности типа", так как деструктор не описан, он не виртуал и связать место удаление можно на этапе компиляции с кодом деструктора (уже описанного типа где бы он не лежал в cpp'шниках) - и отсюда UB. Так вот я не могу понять почему никто не ругается, что класс incomplite и спокойно связывает его с описанным телом деструктора.

А строка, если добавить, в мой пример:
C++
1
*m_ptr = 10;
Скажет, что нельзя произвести операцию присваения немодифицироваемому элемменту - но не слово про incomplite type.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2015, 17:58     Incomplite type delete
Посмотрите здесь:

error: cannot delete expression of type 'char' C++
E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' C++
C++ В чем разница между delete и delete[]?
"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
C++ Mix of type 'bool' and type 'float'
C++ С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить?
Чем отличается delete[] от delete? C++
delete[] *pointer vs. delete pointer и утечка памяти C++
Incomplete type used in nested type specifier - Итерация по списку аргументов C++
Ошибка: argument of type "char *" is incompatible with parameter of type "LPCWSTR" C++
Could not convert variant of type (Null) into type (String) C++
Argument of type char is incompatible with parameter of type char * C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nosey
1326 / 394 / 107
Регистрация: 22.10.2014
Сообщений: 847
Завершенные тесты: 2
19.11.2015, 19:15     Incomplite type delete #2
А в чём вопрос заключается?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тобишь при delete ptr_; компилятор не тратит ресурсы на проверку "завершенности типа"
И что это за компилятор такой?
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
19.11.2015, 19:21     Incomplite type delete #3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
компилятор не тратит ресурсы на проверку "завершенности типа"
???
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Так вот я не могу понять почему никто не ругается
Обратный вопрос: почему кто-то должен ругаться? Говорится только про UB, warning'и на эту тему есть:
main.cpp||In member function 'void B::f()':|
main.cpp|13|warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]|
main.cpp|13|warning: invalid use of incomplete type 'class A'|
main.cpp|4|note: forward declaration of 'class A'|
main.cpp|13|note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined|
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Скажет, что нельзя произвести операцию присваения немодифицироваемому элемменту - но не слово про incomplite type.
Чем компилишь? У меня gcc говорит
main.cpp|13|error: invalid use of incomplete type 'class A'|
ct0r
Игогошка!
1754 / 656 / 42
Регистрация: 19.08.2012
Сообщений: 1,253
Завершенные тесты: 1
20.11.2015, 12:38     Incomplite type delete #4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
пытаюсь постичь смысл UB стандарта
А в чем проблема?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Таблетка от UB:
Во-первых, эта проверка отсеивает те корректные случаи, в которых мы все-таки можем безнаказанно сделать delete неполному типу.
Во-вторых, это писалось еще в те времена, когда не было static_cast.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тобишь при delete ptr_; компилятор не тратит ресурсы на проверку "завершенности типа", так как деструктор не описан, он не виртуал и связать место удаление можно на этапе компиляции с кодом деструктора (уже описанного типа где бы он не лежал в cpp'шниках) - и отсюда UB. Так вот я не могу понять почему никто не ругается, что класс incomplite и спокойно связывает его с описанным телом деструктора.
А по-русски? Сомневаюсь, что хоть кто-то понял этот поток слов.

И не incomplIte, а incomplEte, блин.

Добавлено через 14 часов 5 минут
Только сейчас заметил, что опечатался - не static_cast, а static_assert конечно же
Yandex
Объявления
20.11.2015, 12:38     Incomplite type delete
Ответ Создать тему
Опции темы

Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru