MySQLi
намного безопаснее, чем MySQL
, который в любом случае устарел. Вот почему вы должны придерживаться MySQLi
, а также вы не можете смешивать их, поскольку они оба разные.
new выделяет объем памяти, необходимый для хранения запрашиваемого объекта / массива. В этом случае n чисел int.
Затем указатель сохранит адрес в этом блоке памяти.
Но будьте осторожны, этот выделенный блок памяти не будет освобожден, пока вы не скажите это, написав
delete [] array;
Операция в основном делает следующее:
Он выделяет пространство в куче, равное целочисленному массиву размера N, и возвращает указатель на него, который присваивается указателю типа int * «array»
Начиная с C ++ 11, безопасный для памяти способ сделать это (все еще используя аналогичную конструкцию) с помощью std::unique_ptr
:
std::unique_ptr<int[]> array(new int[n]);
Это создает умный указатель на блок памяти, достаточно большой для целых чисел n
, который автоматически удаляет себя, когда он выходит из области видимости. Эта автоматическая очистка важна, потому что она избегает сценария, когда ваш код рано уходит и никогда не достигает вашего оператора delete [] array;
.
Другой (вероятно, предпочтительный) вариант должен был бы использовать std::vector
, если вам нужен массив, способный к динамическому изменению размера. Это хорошо, когда вам нужно неизвестное пространство, но оно имеет некоторые недостатки (непостоянное время для добавления / удаления элемента). Вы можете создать массив и добавить к нему элементы с чем-то вроде:
std::vector<int> array;
array.push_back(1); // adds 1 to end of array
array.push_back(2); // adds 2 to end of array
// array now contains elements [1, 2]
Он выделяет столько места в соответствии со значением n, и указатель укажет на массив i.e 1-й элемент массива
int *array = new int[n];
Оператор new
выделяет пространство для блока из целых чисел n
и присваивает адрес памяти этому блоку переменной int*
array
.
Общий вид нового, применимый к одномерным массивам, выглядит следующим образом:
array_var = new Type[desired_size];
int *array = new int[n];
Он объявляет указатель на динамический массив типа int
и размер n
.
Немного более подробный ответ: new
выделяет память размером, равной sizeof(int) * n
байтам, и возвращает память, которая хранится переменной array
. Кроме того, поскольку память динамически распределяется с помощью new
, вы должны освободить ее вручную, написав (когда вам больше не нужно, конечно):
delete []array;
В противном случае ваша программа будет памяти утечки не менее sizeof(int) * n
байтов (возможно, больше, в зависимости от стратегии распределения, используемой реализацией).
array
на самом деле является указателем на int
, а не на массив. И утечка памяти будет, по крайней мере, того размера, о котором вы упомянули, но это может быть легко.
– Neil Butterworth
25 April 2011 в 09:25
std::vector<int> array(5);
, поскольку это правильный способ создания такого объекта в C ++». – Aaron McDaid 12 July 2015 в 15:20delete
не будет вызван. В принципе, обычные разработчики никогда не должны явно вводитьnew
(илиdelete
) в современный C ++. – Aaron McDaid 12 July 2015 в 15:21vector
идентичнаint [n]
. Если мы предположим, что нам нужен безопасный ответ на исходный вопрос, у нас действительно есть только два варианта:unique_ptr<int[]>
иvector<int>
. Первый может быть «более чистым», но я уверен, что большинство из нас (включая вас возможно?) Будут использоватьvector
для решения актуальной проблемы, с которой сейчас сталкивается вопрошающий. Мы не знаем полного контекста их текущего назначения программирования, но это справедливая ставка, чтоvector
- это решение, которое большинство из нас будет использовать. – Aaron McDaid 12 July 2015 в 15:47