У меня тут пара вопросов, на которые нужно найти ответ:
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.>У меня тут пара вопросов, на которые нужно найти ответ:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
В углу заплачет мать старушка,
Слезу утрет старик отец.
...
st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Это не важно. Главное, что последствия будут те же что и в первом случае.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: вопросы по C++ на собеседование
От:
Аноним
Дата:
10.02.06 08:51
Оценка:
st.>>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++? А>Можно использовать как идентификаторы ключевые слова С++, которые не являются ключевыми словами С (class, private, protected и т.д.).
Помню, помню, была у нас системка написанная на сях, когда переводили под С++, нарвались на идентификатор переменной new. Не забыть никогда
Здравствуйте, st., Вы писали:
st.>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”?
Уже объяснили
st.>31. Есть что-то, что можно сделать в Си, но нельзя сделать в С++?
Variable length array.
Здравствуйте, Аноним, Вы писали:
st.>>30. Что случится, если выделить память используя “new”, и освободить ее, используя “free”? А>Неопределенное поведение
Как раз определенное )), а определяется текущей перегрузкой (реализацией) оператора new, например в VC6 это malloc(). Так, что можно смело вызвать free
Здравствуйте, 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; тоже определено.
Например, микрософтские некоторые (не проверял, мб и все) просто вызовут только один деструктор. Определено поведение ?