Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Incomplite type delete - C++

19.11.2015, 17:58. Просмотров 251. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2015, 17:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Incomplite type delete (C++):

error: cannot delete expression of type 'char' - C++
Здравствуйте. Я c++ всерьез начал заниматься недавно, и сегодня у меня вылезла ошибка, которую я раньше никогда не встречал: error:...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

Incomplete type used in nested type specifier - Итерация по списку аргументов - C++
Здравствуйте! Пытаюсь написать утилитарную структуру для применения шаблонной функции на списке аргументов. #include &lt;tuple&gt; ...

E2094 'operator<<' not implemented in type 'ostream' for arguments of type 'Binary' - C++
Здравствуйте, уважаемые форумчане, выкидываю код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; class Binary { ...

С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить? - C++
Написал программу для расчёта площади четырёхугольника и круга. Использовал простые операторы присвоения. Всё работало как надо. Но...

3
Nosey
1349 / 400 / 107
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
19.11.2015, 19:15 #2
А в чём вопрос заключается?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тобишь при delete ptr_; компилятор не тратит ресурсы на проверку "завершенности типа"
И что это за компилятор такой?
0
Somebody
2798 / 1609 / 149
Регистрация: 03.12.2007
Сообщений: 4,204
Завершенные тесты: 3
19.11.2015, 19:21 #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'|
0
ct0r
Игогошка!
1784 / 686 / 42
Регистрация: 19.08.2012
Сообщений: 1,321
Завершенные тесты: 1
20.11.2015, 12:38 #4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
пытаюсь постичь смысл UB стандарта
А в чем проблема?

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

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

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

Добавлено через 14 часов 5 минут
Только сейчас заметил, что опечатался - не static_cast, а static_assert конечно же
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2015, 12:38
Привет! Вот еще темы с ответами:

Could not convert variant of type (Null) into type (String) - C++
if(DBLookupComboBoxDoctor-&gt;ListField.IsEmpty()) ...

Mix of type 'bool' and type 'float' - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { float x,y,i; for(i=1;i&lt;5;++i) { ...

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

Argument of type char is incompatible with parameter of type char * - C++
Столкнулся с ошибкой, не получается никак исправить #define DUTIES 100 class POSITIONDLL_API Position { private: char...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru