Следовательно, что происходит с другим указателем в этом случае?
Он теряется. Вы сбросили последнюю ссылку на массив, на который A
указывал (A
и B
не указывают на указатели. Это указатели, и они указывают на первый элемент массивов, ie int
s соответственно).
А как его удалить?
Нельзя. Утечка памяти.
Никогда не используйте необработанные указатели владения. Для динамических массивов c вы можете использовать std::vector
, а для других вы можете использовать интеллектуальные указатели. С std::vector
ваш код будет:
#include <vector>
int main{
auto A = std::vector<int>(4);
auto B = std::vector<int>(4);
A = B;
}
И для полноты также версия вашего кода без утечек:
void please_dont_do_this() {
int * A = new int[4];
int * B = new int[4];
delete [] A; // delete the array before the pointer is lost
A = B;
delete[] B; // delete the array only once !
}
PS: Я знаю, что это представление не очень популярен среди энтузиастов c новичков, которые хотят узнать как можно больше, но имхо самая важная вещь, которую вам нужно знать о необработанных указателях в C ++, это то, что они вам почти никогда не понадобятся (а когда вы думаете, что они вам нужны, то, скорее всего, вы все еще не знаете).