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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти количество чисел в массиве типа char http://www.cyberforum.ru/cpp-beginners/thread1303976.html
задание полностью стоит следующее: в массиве типа char вывести только те слова, которые состоят из латинских букв и вывести количество чисел в массиве, если такие имеются. Числе, не цифр! #include<iostream> #include<string.h> #include <stdlib.h> using namespace std; int main() { char text;//ñòðîêà
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; //визначення перелічуваного типу користувача boolean enum boolean(true, false); //визначення шаблону елемента списку за допомогою типу struct struct stack{
Обработка двумерного массива: найти количество строк и номер столбца по условию 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> #include <cstdio> int main(){ setlocale(LC_ALL, "Russian"); int n, a, sum=0; printf("введите n"); подробнее

Показать сообщение отдельно
hoggy
6427 / 2645 / 458
Регистрация: 15.11.2014
Сообщений: 5,834
Завершенные тесты: 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 всегда валидный. И соответственно может наоптимизировать.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru