Удаление массива указателей (C ++) [duplicate]

Проблема заключается в методе input.nextInt () - он только считывает значение int. Поэтому, когда вы продолжаете чтение с помощью input.nextLine (), вы получаете ключ «\n» Enter. Поэтому, чтобы пропустить это, вы должны добавить input.nextLine (). Надеюсь, это должно быть ясно сейчас.

Попробуйте это так:

System.out.print("Insert a number: ");
int number = input.nextInt();
input.nextLine(); // This line you have to add (It consumes the \n character)
System.out.print("Text1: ");
String text1 = input.nextLine();
System.out.print("Text2: ");
String text2 = input.nextLine();
15
задан Brian Tompsett - 汤莱恩 28 August 2015 в 15:17
поделиться

6 ответов

Нет, delete [] используется для удаления массива. Если вам нужно удалить элементы массива, вам нужно вызвать delete для каждого из них.

22
ответ дан juanchopanza 22 August 2018 в 11:00
поделиться
  • 1
    возможно ПЕРЕД удалением массива ;-) – Emilio Garavaglia 29 June 2016 в 19:14

Удалить [] удалит только элементы в массиве. Он не удалит память, указанную элементами массива. Если вы хотите удалить память, указанную элементами массива

  1. , удалите каждую ячейку явным образом, вызвав delete для каждого элемента массива
  2. Затем удалите массив с помощью оператора delete []
1
ответ дан Able Johnson 22 August 2018 в 11:00
поделиться

delete[] вызовет деструктор каждого элемента массива.

Именно поэтому используются интеллектуальные указатели: delete[] вызовет деструктор каждого элемента, а деструктор - умного указателя вызовет delete на управляемом указателе.

Итак: узнайте о умных указателях и прекратите управлять памятью вручную. Это проще, меньше подверженности ошибкам и менее низкого уровня.

2
ответ дан Community 22 August 2018 в 11:00
поделиться

Нет, delete[] освобождает только массив, созданный new[]

См. ссылку для получения дополнительной информации.

1
ответ дан Intrepidd 22 August 2018 в 11:00
поделиться
  • 1
    Это не просто «освобождение массива», но и разрушает элементы массива. – Kerrek SB 12 February 2014 в 17:23
  • 2
    @KerrekSB, но не объекты, на которые указывают элементы массива. – Jossie Calderon 29 June 2016 в 16:05

Нет. Необработанные указатели не содержат информации о том, как (или) должна ли их цель быть освобождена, поэтому уничтожение одного никогда не удалит цель.

Вот почему вы никогда не должны использовать их для управления динамическими ресурсами - вам нужно сделать вся работа сама, которая может быть очень подвержена ошибкам. Вместо этого вы должны использовать RAII , заменяя указатели контейнерами, интеллектуальными указателями и другими классами, которые управляют ресурсами и автоматически освобождают их при уничтожении. Замените динамический массив на std::vector (или std::vector<std::unique_ptr>, если вам действительно нужно выделить каждый объект отдельно), и все будет автоматически освобождено.

7
ответ дан Mike Seymour 22 August 2018 в 11:00
поделиться

Нет, если a представляет собой динамически выделенный массив необработанных указателей, delete[] a; просто удаляет память, занятую массивом необработанных указателей, но not вызывает деструкторы для объектов

.

Итак, если эти исходные указатели являются владеющими указателями , у вас есть leaktrocity :)

Используйте контейнер STL класс с интеллектуальными указателями, например std::vector<std::unique_ptr<X>>, для более современного и более простого подхода: таким образом вы получаете как исключение-безопасность , так и автоматическое уничтожение как массива указателей, так и объектов, указывающих к.

3
ответ дан Mr.C64 22 August 2018 в 11:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: