Здравствуйте, Lorenzo_LAMAS, Вы писали:
А>>Помню, помню, была у нас системка написанная на сях, когда переводили под С++, нарвались на идентификатор переменной new. Не забыть никогда
L_L>Я думаю, как раз случай с new легко обнаруживался и исправлялся. Вообще, вопрос был что можно сделать в С такого чего нельзя в С++ и потому использование идентификаторов-ключевых слов С++ — нормальный ответ. Я вот встречался с программой на С, в которой были имена функций and/or (хотя, они, конечно, не ключевые слова, но альтернативные токены в С++)
PD>1. Вызывать функцию, которая не была до этого декларирована.
В C99 уже нельзя.
PD>2. Присваивать числовую константу указателю PD>char * p = 123;
PD>3. Присваивать друг другу указатели разного типа PD>int *pi = p; // p из п. 2
Это требование стандарта? Но и в 6-ой студии (ладно, тогда стандарта еще не было), и в 2003-й (он уже был) прекрасно рекурсивные вызовы main прокатывают.
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, L2-Max, Вы писали:
LM>>Здравствуйте, Аноним, Вы писали:
st.>>>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>>>Неопределенное поведение
LM>>Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free
VE>И где же оно определено для ВСЕХ реализаций ? VE>Так можно сказать, что и VE>A *a = new A[100]; delete a; тоже определено. VE>Например, микрософтские некоторые (не проверял, мб и все) просто вызовут только один деструктор. Определено поведение ?
Нет, ну вы одолели сударь. Неужели не понятно. Причем тут деструкторы, причем тут связка new[] delete[]. Был вопрос, каков будет результат при вызове free для указателя созданного new. Я ответил лишь, что если взять, к примеру, VC6, то я знаю, что там память выделяется с помощю malloc.
смотрим:
void* p(new char); //эквивалентно void* p(malloc(1)); для интегрального типа конструктор не вызовется
free(p);
Здравствуйте, st., Вы писали:
st.>Доброго времени суток всем.
st.>У меня тут пара вопросов, на которые нужно найти ответ:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
st.>Если можно, с кратким пояснением.
st.>Заранее благодарен за помощь.
31. По моему в C согласно новому стандарту можно такое
void function(int size)
{
char a[size];
...
}
Feierlich, misterioso
Re[2]: вопросы по C++ на собеседование
От:
Аноним
Дата:
13.02.06 09:43
Оценка:
Здравствуйте, st., Вы писали:
st.>благодарю за ответы. Теперь у меня на пару козырей больше Еще такие вопросы:
st.>12. Что такое автоматический указатель? st.>19. Что такое безымянная конструкция?
Напишите,пожалуйста,все вопросы.
Или дайте адресок.
Здравствуйте, Bell, Вы писали:
PD>>3. Присваивать друг другу указатели разного типа PD>>int *pi = p; // p из п. 2
B>Ни в C89 ни в C99 пункты 2 и 3 сделать нельзя.
Честно говоря, стандарты я сто лет не читал, но последнее в VC6 компилируется и работает. Он 1998 года, так что C99 не может удовлетворять, но почему не удовлетворяет C89 — не знаю.
Есть в С99 вроде еще одна интересная вещь — "перегрузка макросов" — у них вроде так sin/cos для разных типов есть. Причем эта "перегрузка" макросов используется только реализацией, программист сам такого сделать не может.
Of course, the code must be complete enough to compile and link.
Здравствуйте, DIMEDROLL, Вы писали:
DIM>только что проверил на 2005 студии, в Си компилится в С++ — нет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
LM>Нет, ну вы одолели сударь. Неужели не понятно. Причем тут деструкторы, причем тут связка new[] delete[]. Был вопрос, каков будет результат при вызове free для указателя созданного new. Я ответил лишь, что если взять, к примеру, VC6, то я знаю, что там память выделяется с помощю malloc.
LM>смотрим:
LM>void* p(new char); //эквивалентно void* p(malloc(1)); для интегрального типа конструктор не вызовется LM>free(p);
LM>результат предсказуем ?
Нифига подобного. Например, существует либа, определяющая operator new / operator new[] / operator delete / operator delete[] и никак не завязанная на malloc/free (или как минимум выдающая в качестве результата указатель, не являющийся результатом malloc).
Корректный код будет нормально работать что с этой либой что без нее.
А вот код, не соблюдающий парность вызовов -- рухнет.
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Я бы ответил что много чего плохого, в частности — undefined behaviour. Потому что из вопроса не понятно, КАКОЙ оператор new используется — а может пользовательский какой...