#c #constructor #new-operator
#c #constructor #new-operator
Вопрос:
Иногда я допускаю опечатку в одном месте кода моей программы:
int a = 10;
char* b = new char(a);
Ошибка очевидна: я написал () вместо [] . Странная вещь … код скомпилирован нормально, он нормально запускался в отладчике. Но скомпилированный .exe вне отладчика разбился через мгновение после выполнения функции с этими строками.
Действительно ли вторая строка кода допустима? И если да, то что это значит для компилятора?
Ответ №1:
В данном случае это один символ с числовым значением a
10
. Указатели указывают не только на массивы, вы знаете.
Ответ №2:
Вы выделяете единицу char
и присваиваете ей значение из a
. Это вообще не выделение массива.
Это то же самое, что вызывать конструктор в new
выражении для любого другого типа:
std::string* s = new std::string("foo");
int* i = new int(10);
std::vector<std::string>* v = new std::vector<std::string>(5, "foo");
Ответ №3:
char t(a)
создает локальный символ, инициализированный значением a
.
new char (a)
создает динамически выделяемый символ, инициализированный значением a
.