Я пытаюсь ответить на некоторые прошлые бумажные вопросы, которые я получил для практики экзамена, но на самом деле не уверен в этих двух, любая помощь должна быть высоко оценена. (Введенный код с изображения, думаю, все в порядке).Идентифицируйте утечки памяти
Q1: Определите утечки памяти в приведенном ниже коде на C++ и объясните, как их исправить. [9] знаков
#include <string>
class Logger {
public:
static Logger &get_instance() {
static Logger *instance = NULL;
if (!instance){
instance = new Logger();
}
return *instance;
}
void log (std::string const &str){
// ..log string
}
private:
Logger(){
}
Logger(Logger const&) {
}
Logger& operator= (Logger const &) {
}
~Logger() {
}
};
int main(int argcv, char *argv[]){
int *v1 = new int[10];
int *v2 = new int[20];
Logger::get_instance() . log ("Program Started");
// .. do something
delete v1;
delete v2;
return 0;
}
Моего ответ, что если основные не заканчивает выполнение из-за досрочный возврат или исключение броска, что удаления никогда не будут работать в результате чего память никогда не будет освобождена. Я делаю чтение, и я считаю, что auto_ptr решит проблемы? Будет ли это так же просто, как смена строк? :
auto_ptr<int> v1 = new int[10];
auto_ptr<int> v2 = new int[20];
v1.release();
delete v1;
Q2: Почему виртуальным членам требуется больше памяти, чем объекты класса без виртуальных членов?
A: Поскольку каждый виртуальный член требует, чтобы указатель также хранился в vtable, требующем больше места. Хотя это приравнивается к очень небольшому увеличению пространства.
Привет, как я могу освободить экземпляр Logger? (Я знаю о бесплатном и все, что если malloc используется, но не уверен, как это было сделано в этом примере). Это не произойдет в конце основного, так как это все равно вызовет ту же проблему, что и я, изложенный выше, или нет? – user2092004
Не уверен, что предлагаемый подход безопасен, но у вас может быть другая статическая функция, которая будет выполнять освобождение с использованием delete, как уже указывали другие. –
К счастью, это всего лишь объяснение, поэтому мне нужно только знать, что я буду делать. Поэтому, говоря, что память для экземпляра не освобождается и требует выделения. Благодаря! – user2092004