C ++: Почему delete можно использовать в указателях для структурирования без предварительного использования new? - PullRequest
0 голосов
/ 30 июня 2018

Я относительно новичок в C ++ и пытаюсь понять, как правильно удалять структуры. Я понимаю, что оператор delete следует использовать только для указателей, созданных с помощью оператора new.

Однако, в контексте структур и особенно при использовании в двоичном дереве, я теперь часто видел что-то вроде:

struct test_structure {
    int test_content;
}; 
test_structure *test_realization;
// Some code  
delete test_realization;

Я не совсем понимаю, почему это нормально, хотя новый оператор не использовался для создания test_realization. Или я что-то здесь упускаю?

1 Ответ

0 голосов
/ 30 июня 2018

Похоже, вас смущает термин "создан с использованием нового оператора". Поэтому, когда вы пишете:

 test_structure *test_realization = new test_structure;

вы сами не создаете test_realization с помощью оператора new, вы создаете объект, указатель на него возвращается и присваивается test_realization. Такой объект может быть позже уничтожен оператором delete. test_realization - это переменная, которая имеет указатель типа на test_structure и, как и любая другая переменная, может содержать различные значения, может быть инициализирована при определении, может и не быть. Поэтому, когда кто-то говорит, что указатель «создан с использованием оператора new», он имеет в виду значение, которое вы присваиваете test_realization, а не переменной test_realization.

 test_structure *test_realization;
 ...
 test_realization = new test_structure; // now test_realization points to object that created by new
 test_realization->test_content = 123; // we can use that object
 ...
 delete test_realization; // now object, which was created by new destroyed and memory released

Хотя было бы неплохо определить и всегда инициализировать переменную, это не обязательно.

...