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

Можно ли удалить объект экземпляра класса из самого себя? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти количество чисел в массиве типа char http://www.cyberforum.ru/cpp-beginners/thread1303976.html
задание полностью стоит следующее: в массиве типа char вывести только те слова, которые состоят из латинских букв и вывести количество чисел в массиве, если такие имеются. Числе, не цифр!...
C++ Удалить элементы главной диагонали Удалить элементы главной диагонали Почему не работает? for (i=0; i<n; i++) for (j=0; j<m-1; j++) if (i=j) for (i=j; i<n-1; i++) mas=mas; cout<<"our array\n"; http://www.cyberforum.ru/cpp-beginners/thread1303975.html
Создание, просмотр и удаление элементов списка, организованного по принципу LIFO C++
Что делать? Программа просит идентификатор true, false. #include "stdafx.h" #include <iostream> #include <process.h> #include <conio.h> using namespace std; //визначення перелічуваного типу...
Обработка двумерного массива: найти количество строк и номер столбца по условию C++
#include <iostream> #include <iomanip> using namespace std; const int N=20; const int M=20; int main() { double a;
C++ Подскажите.Как вывести N-ую строку или столбец из матрицы? http://www.cyberforum.ru/cpp-beginners/thread1303921.html
Подскажите.Как вывести N-ую строку или столбец из матрицы?
C++ Ошибка "stack around the variable 'n' was corrupted." Есть такая программа. Натуральные числа от 0 до n(a0-an) Необходимо найту сумму всех чисел кратных 5. Выдает ошибку stack around the variable 'n' was corrupted. Почему? #include <clocale>... подробнее

Показать сообщение отдельно
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,294
Завершенные тесты: 1
19.11.2014, 22:20
Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь нет UB. Обычное удаление объекта, созданного new, через указатель.
Нет, не обычное.
Удаление объекта через указатель снаружи - это запуск его диструктора, и освобождение памяти.

Удаление объекта через указатель this - это освобождение памяти в момент, когда диструктор ещё не отработал.
Что в свою очередь опять запускает деструктор, а затем пытается освободить память...

http://rextester.com/HHPM24793

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Title of this code
 
#include <iostream>
using namespace std;
 
 
struct sample
{
    ~sample()
    {
        cout<<"dtor\n";
        delete this;
    }
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample* p = new sample;
    
    p->~sample();
    
}
И дело даже не в сайд-эффектах как таковых.
А в том, что в любом контексте, где доступен this (скоуп, в котором виден this объекта) this должен быть валиден.

Где то на хабре были статейки, о том, как лихо компилятор выпиливает проверки вида:
C++
1
if(this) ...
Потому что закладывается, что this всегда валидный. И соответственно может наоптимизировать.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru