Здравствуйте, Аноним, Вы писали:
st.>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>Неопределенное поведение
Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free
Здравствуйте, st., Вы писали:
st.>У меня тут пара вопросов, на которые нужно найти ответ:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
В углу заплачет мать старушка,
Слезу утрет старик отец.
...
st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Это не важно. Главное, что последствия будут те же что и в первом случае.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
st.>>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++? А>Можно использовать как идентификаторы ключевые слова С++, которые не являются ключевыми словами С (class, private, protected и т.д.).
Помню, помню, была у нас системка написанная на сях, когда переводили под С++, нарвались на идентификатор переменной new. Не забыть никогда
Здравствуйте, 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
У меня тут пара вопросов, на которые нужно найти ответ:
30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Если можно, с кратким пояснением.
Заранее благодарен за помощь.
Re: вопросы по C++ на собеседование
От:
Аноним
Дата:
10.02.06 08:47
Оценка:
Здравствуйте, st., Вы писали:
st.>Доброго времени суток всем.
st.>У меня тут пара вопросов, на которые нужно найти ответ:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Неопределенное поведение st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Можно использовать как идентификаторы ключевые слова С++, которые не являются ключевыми словами С (class, private, protected и т.д.). st.>Если можно, с кратким пояснением.
st.>Заранее благодарен за помощь.
Здравствуйте, st., Вы писали:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Уже объяснили
st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Variable length array.
Здравствуйте, L2-Max, Вы писали:
st.>>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>>Неопределенное поведение
LM>Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free
Если ты только выделяешь память, вызывая оператор new — то можешь, пользуясь тайным знанием о конкретной реализации оператора delete, выполнить его вручную.
Здравствуйте, st., Вы писали:
st.>Доброго времени суток всем.
st.>У меня тут пара вопросов, на которые нужно найти ответ:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Неопределенное поведение. st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
рекурсивно вызывать main.
Здравствуйте, L2-Max, Вы писали:
LM>я что то не так сказал ?
Для объектов не-POD типов delete вызывает деструктор.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
А>Помню, помню, была у нас системка написанная на сях, когда переводили под С++, нарвались на идентификатор переменной new. Не забыть никогда
Я думаю, как раз случай с new легко обнаруживался и исправлялся. Вообще, вопрос был что можно сделать в С такого чего нельзя в С++ и потому использование идентификаторов-ключевых слов С++ — нормальный ответ. Я вот встречался с программой на С, в которой были имена функций and/or (хотя, они, конечно, не ключевые слова, но альтернативные токены в С++)
Of course, the code must be complete enough to compile and link.
Здравствуйте, gear nuke, Вы писали:
LM>>я что то не так сказал ?
GN>Для объектов не-POD типов delete вызывает деструктор.
На самом деле, это ещё вопрос — шла ли речь о конструировании объекта или только о выделении блока памяти.
Хотя неопределённое поведение всё равно будет, потому что free предполагает, что на входе у неё указатель, полученный от malloc, а не что попало.
Здравствуйте, st., Вы писали:
st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Из того, что не сказали:
Макросы с переменным числом аргуменотов (параметр __VA_ARGS__).
Можно использовать прагмы в макроподстановках (_Pragma).
Встроенные типы _Complex и _Imaginary.
Квалификатор restrict.
Хотя... далеко не в любом C (и последние 2 пункта плохо попадают под "можно\нельзя")
И ещё что-то связанное с поинтерами void *, но это совсем уж притянуто...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, L2-Max, Вы писали:
LM>Здравствуйте, Аноним, Вы писали:
st.>>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>>Неопределенное поведение
LM>Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free
И где же оно определено для ВСЕХ реализаций ?
Так можно сказать, что и
A *a = new A[100]; delete a; тоже определено.
Например, микрософтские некоторые (не проверял, мб и все) просто вызовут только один деструктор. Определено поведение ?
Это требование стандарта? Но и в 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).
Корректный код будет нормально работать что с этой либой что без нее.
А вот код, не соблюдающий парность вызовов -- рухнет.
Re: вопросы по C++ на собеседование
От:
Аноним
Дата:
25.05.09 09:45
Оценка:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Я бы ответил что много чего плохого, в частности — undefined behaviour. Потому что из вопроса не понятно, КАКОЙ оператор new используется — а может пользовательский какой...
Здравствуйте, Аноним, Вы писали:
st.>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>Я бы ответил что много чего плохого, в частности — undefined behaviour. Потому что из вопроса не понятно, КАКОЙ оператор new используется — а может пользовательский какой...
Согласен. Думаю, такого ответа хватит для вашей конторы.