Проблема заключается в методе 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();
Нет, delete []
используется для удаления массива. Если вам нужно удалить элементы массива, вам нужно вызвать delete
для каждого из них.
Удалить [] удалит только элементы в массиве. Он не удалит память, указанную элементами массива. Если вы хотите удалить память, указанную элементами массива
delete[]
вызовет деструктор каждого элемента массива.
Именно поэтому используются интеллектуальные указатели: delete[]
вызовет деструктор каждого элемента, а деструктор - умного указателя вызовет delete
на управляемом указателе.
Итак: узнайте о умных указателях и прекратите управлять памятью вручную. Это проще, меньше подверженности ошибкам и менее низкого уровня.
Нет, delete[]
освобождает только массив, созданный new[]
Нет. Необработанные указатели не содержат информации о том, как (или) должна ли их цель быть освобождена, поэтому уничтожение одного никогда не удалит цель.
Вот почему вы никогда не должны использовать их для управления динамическими ресурсами - вам нужно сделать вся работа сама, которая может быть очень подвержена ошибкам. Вместо этого вы должны использовать RAII , заменяя указатели контейнерами, интеллектуальными указателями и другими классами, которые управляют ресурсами и автоматически освобождают их при уничтожении. Замените динамический массив на std::vector
(или std::vector<std::unique_ptr>
, если вам действительно нужно выделить каждый объект отдельно), и все будет автоматически освобождено.
Нет, если a
представляет собой динамически выделенный массив необработанных указателей, delete[] a;
просто удаляет память, занятую массивом необработанных указателей, но not вызывает деструкторы для объектов
.
Итак, если эти исходные указатели являются владеющими указателями , у вас есть leaktrocity :)
Используйте контейнер STL класс с интеллектуальными указателями, например std::vector<std::unique_ptr<X>>
, для более современного и более простого подхода: таким образом вы получаете как исключение-безопасность , так и автоматическое уничтожение как массива указателей, так и объектов, указывающих к.