В основной функции я создаю объект, используя new, и не удаляю его. Я надеюсь, что пространство кучи будет очищено после завершения процесса. Ниже приведен пример кода, где объект класса A является переменной-членом класса B. Класс B также имеет мультикарту в качестве переменной-члена.
Class A
{
Public:
A(); //have definition in cpp file
~A();//have definition in cpp file
Private:
Int a;
};
Class B{
Private:
Std::multimap<string,string> map_test;
Public:
A a;
B(); //have definition inn cpp file
~B();//does not have any definition in cpp file
};
int main()
{
B *b = new B();
/* code section where it fills some 1000 key value pairs in the multimap
for some purpose */
return 0;
}
Мое понимание:
Да, пока ваш объект создан в main.
Однако, если вы когда-либо захотите изменить это и, например, создать несколько экземпляров B, или использовать его внутри другого класса, и т. Д. И т. Д., Это другая история. Кроме того, инструменты проверки памяти, такие как valgrind, будут давать вам ложные срабатывания при новом удалении без удаления, которое вы будете склонны игнорировать. Но тогда вы можете игнорировать настоящую утечку памяти, если она станет привычкой.
Правильно, теперь, если это было map<string, string*>
тогда вам, скорее всего, придется убирать
Это вызовет деструктор по умолчанию
Да, это будет
Я думаю, вы спрашиваете, где хранятся переменные членов базового класса? Они также хранятся в куче. Они предшествуют полям производного класса в памяти.
Вы задали много вопросов.
Сначала рекомендуется всегда очищать вашу память, даже если процесс завершает работу и очищает всю память (как она это делает). Всегда справляйся … это легко сделать, используя shared_ptr …
Деструкторы всегда вызываются в правильном порядке, однако ваша мультикарта является опасностью, поскольку вы должны очищать элементы в мультикарте, так как если вы храните указатели, это может вызвать серьезную утечку
b
Вы можете просто создать объект в стеке, и вам не придется думать об управлении ресурсами.Факт: в C ++ нет встроенной (под таблицей) сборки мусора, хотя есть много вещей, которые могут навязать какую-то сборку мусора.
Таким образом, в вашем коде у вас есть утечка памяти. В конце области, в которой вы выделяете B, выделенная вами память не является free’d.
Просматривая ваш список вопросов:
Нет, если вы не удалите указатель, память не будет свободна. Есть несколько вещей, которые вы можете сделать по этой теме:
std::shared_ptr
а также std::unique_ptr
) и убедитесь, что память, за которую они отвечают, правильно free’d.Это зависит. Если вы распределили объекты с помощью new
оператор, затем вставил их в карту, но они не упоминаются где-либо еще, то вы должны вручную удалить каждую запись карты. Это не применяется в этом случае, потому что типы карт не указатели.
Класс может даже пропустить объявление деструктора. Если они опущены, компилятор генерирует деструкторы (но также оператор присваивания копии, конструктор копирования и конструктор по умолчанию).
Отредактировано: зависит, если вы объявили участника A a;
Вам не нужно явно удалять его, его деструктор будет вызываться, когда классу, который объявляет его как член, вызывается деструктор. но если это указатель, который вы разместили (например, в конструкторе), то вы должны удалить его в деструкторе.
Как только вы используете динамическое выделение памяти для объекта, все Объект находится в куче, независимо от того, как его члены объявлены.