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

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

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

Incomplite type delete - C++

19.11.2015, 17:58. Просмотров 223. Ответов 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++
Здравствуйте. Я c++ всерьез начал заниматься недавно, и сегодня у меня вылезла ошибка, которую я раньше никогда не встречал: error:...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

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

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

new и delete - C++
как лучше очищать память? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; //как лучще очищать память? int main(){ char *buff...

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nosey
1346 / 397 / 107
Регистрация: 22.10.2014
Сообщений: 861
Завершенные тесты: 2
19.11.2015, 19:15     Incomplite type delete #2
А в чём вопрос заключается?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тобишь при delete ptr_; компилятор не тратит ресурсы на проверку "завершенности типа"
И что это за компилятор такой?
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 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'|
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2015, 12:38     Incomplite type delete
Еще ссылки по теме:

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include &lt;iostream&gt; using namespace std; class point { ...

Разобраться с delete [] - C++
Господа программисты!!! Помогите решить проблему. Есть матрица, созданная динамично int **matrix = new int*; for (int i = 0;...

Delete[] Ошибка - C++
Здравствуйте. Я никак не могу разобраться с одной ошибкой при освобождении памяти. Причем эта ошибка довольно странная, она появляется...


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

Или воспользуйтесь поиском по форуму:
ct0r
Игогошка!
1768 / 670 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 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
Ответ Создать тему
Опции темы

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