31 вопрос
Практика
Как ты понимаешь строку кода `delete this;` и почему это считается плохой практикой, особенно когда класс предназначен для использования другими программистами и может быть создан как статический, extern или автоматический объект?
Можно ли указать оператору `new` выделять память из конкретного участка памяти, и если да, как это сделать с помощью пулов памяти или кастомных аллокаторов?
Что такое выравнивание памяти и как оно связано с тем, как адреса указателей структурированы с точки зрения двоичного представления?
Какие методы отладки ты использовал, когда сталкивался с проблемой? Например, работал ли ты с GDB, DBG, Forte или Visual Studio, анализировал core dumps, отслеживал последний системный вызов перед краш'ем через tusc или добавлял debug statements прямо в исходный код программы?
Какое значение имеет объявление переменной-члена как static, и как это влияет на поведение переменной при множественных вызовах функций?
Можешь объяснить три основных storage qualifier в C++ (const, volatile и mutable) и описать, как каждый из них влияет на доступ к памяти и модификацию переменных?
Какие есть классы хранения в C++, и какие у них характеристики и предназначение, включая auto, register, static и extern?
Можешь объяснить, как компилятор организует разные секции внутри исполняемого файла и описать роль каждой секции, включая то, как выделяется память для статических переменных?
Как C++ программу можно линковать с C функциями, и какую роль играет спецификация linkage `extern "C"` в этом процессе?
Какую проблему решает класс auto_ptr в C++?
Можешь объяснить, что такое утечка памяти, привести пример того, как она происходит, и описать, в чём разница между тем, что происходит с переменной-указателем и памятью, на которую он указывает, когда этот указатель выходит из области видимости?
Законно и этично ли членской функции вызывать `delete this`, и при каких условиях это можно делать безопасно?
Как компилятор определяет количество объектов, n, которые нужно деструктировать, когда ты используешь `delete[] p` после выделения массива с помощью `p = new Fred[n]`?
Можно ли вообще опускать скобки ([]) когда используешь delete на массиве встроенного типа, типа char или int?
Какие последствия, если забудешь использовать delete[] при освобождении памяти массива, который выделил с помощью new T[n], и почему это на тебе лежит ответственность за правильное управление памятью в этом случае?
Как тебе правильно выделить и освободить память для массива объектов в C++?
Какие два шага в выполнении оператора `delete p`, и в чём смысл каждого?
Как ты можешь настроить свой компилятор, чтобы он автоматически проверял, возвращает ли оператор `new` значение `NULL`, и какие есть альтернативы, если твой компилятор эту фишку не поддерживает?
Это безопасно использовать realloc() на памяти, выделенной с помощью new в C++?
Почему обычно лучше использовать `new` вместо традиционной функции `malloc()`, и какие преимущества дает `new` в плане конструирования объектов, типобезопасности и кастомизации?
Можно ли безопасно использовать free() на памяти, выделенной с помощью new, или delete на памяти, выделенной с помощью malloc()?
Как правильно выделять и управлять многомерными массивами с помощью динамического выделения памяти в C++ с `new`, учитывая разные сценарии — когда размеры известны на этапе компиляции, когда прямоугольные матрицы определяются во время выполнения, и когда массивы имеют неправильную форму с разными длинами строк?
Как функция free определяет, сколько памяти освободить при вызове?
Как функция `free` определяет, сколько памяти освободить, когда ей дан указатель, выделенный с помощью `malloc`, например: `int *i = (int *)malloc(12);` а потом `free(i);`?
Чем отличается ключевое слово "new" от "operator new" в C++, и как "operator new" работает похоже на malloc?
Какие ключевые различия между malloc()/free() и new/delete в смысле выделения памяти, инициализации объектов, вызова конструкторов/деструкторов, type safety и extensibility?
В чём разница между `delete` и `delete[]`, и когда что использовать?
В чём отличие оператора `new` от функции `malloc` в плане выделения памяти, требований к приведению типов и освобождению памяти?
В чём разница между операторами C++ new и delete и функциями C malloc и free? Как new и delete работают с конструированием и деструированием объектов по сравнению с malloc и free, которые просто управляют выделением и освобождением памяти?
Какие потенциальные проблемы и риски связаны с использованием выражения "delete this;" в C++?
Что такое placement new и в каких ситуациях его имеет смысл использовать?