2016-10-05 2 views
0

Я новичок в C++, и мне было интересно, почему ...C++ после удаления

#include <iostream> 
using namespace std; 
class myClass{ 
    public: 
     void myMethod(){ 
      cout << "It works!" << endl; 
     } 
     myClass(){ 
      cout << "myClass is constructed!" << endl; 
     } 
     ~myClass(){ 
      cout << "This class is destructed!" << endl; 
     } 
}; 
int main() 
{ 
    myClass c; 
    c.myMethod(); 
    myClass *e = &c; 
    delete e; 
    cout << "This is from main" << endl; 
    return 0; 
} 

Так там есть код. и выход

myClass is constructed! 
It works! 
This class is destructed! 

мне интересно, откуда взялись «Это от основного» выхода уйти .. это C++ не выполняет коды после удаления ключевого слова?

+4

Неопределенное поведение не определено. – LogicStuff

+2

Я думаю, что вы получаете ошибку сегментации или другую ошибку времени выполнения вместо ожидаемого вывода – ForceBru

+1

Удаление объекта, который вы не новичок, ведет к неопределенному поведению. – evan

ответ

9

Вы можете только delete объектов, которые были созданы с помощью new.

Что вы делаете, это UB, путем двойного удаления.

Кстати, в то время как в этом случае ваша программа остановилась исполнение сразу же после того, как заявление, что было UB, это не обязательно должно произойти так, потому что

Однако, если такое исполнение содержит неопределенное эта операция В Международном стандарте нет необходимости в реализации , выполняющей эту программу с этим вводом (даже в отношении операций, предшествующих первой неопределенной операции).

+0

Итак, что я сделал, я удалил ссылку класса? – ReventonMC

+0

Вы удаляете экземпляр, который не был присвоен 'new'. Это запрещено. –

+0

О, так это вызвало ошибку и просто закончило мою программу. Спасибо. – ReventonMC

0

Вы вызвали неопределенное поведение, удалив что-то новое. Вам не нужно удалять вещи, которые просто указывают на какое-то общее местоположение. Вы удаляете только то, что вы создали, вызвав new (не место новое!).

3

У вас есть неопределенное поведение. Вам не разрешено delete что-то, что не было выделено new. При этом у вас есть неопределенное поведение, и вашей программе разрешено делать то, что она хочет.

Скорее всего, вы должны были получить какую-то жесткую ошибку, из-за которой программа не запускалась.

+0

У меня не было никакой ошибки. Я использовал cpp.sh, потому что меня не было дома XD – ReventonMC

+0

Как я уже сказал, вам не нужно. Это UB, поэтому ничего не происходит. – NathanOliver

+0

Строго говоря, неопределенное поведение не означает, что программе разрешено делать то, что она хочет. Вместо этого это означает, что то, что программа будет делать, совсем не указывается. –

0

Возможно, вам будет полезно прочитать о стеке и памяти кучи.

Вы должны освобождать только в том случае, если вы malloc (или другие варианты, такие как calloc).

Например:

char *c = (char *)malloc(255); 
... 
free(c) 

Вы должны удалить только если вы используете новый.

MyClass *e = new MyClass() 
... 
delete e 

Вы должны удалить [], только если вы используете новый []

char *data = new char[20] 
... 
delete[] data 

Теперь, если вы делаете что-то вроде этого:

... 
{ 
    int x; 
    x = 3; 
} 

х будет уничтожен после наручи, потому что он выходит за рамки. Это помещает x в стек. Однако, если вы используете malloc, new или delete, сама переменная может быть потеряна, если вы не будете осторожны, но выделена память. Это утечка памяти.

У вас еще опаснее. Вы удаляете то, что не было выделено. Поведение не определено.Со временем и терпением квалифицированный хакер может изучить поведение и может проникнуть в вашу систему и получить те же привилегии, что и ваша программа.

Смежные вопросы