Я не понимаю о разнице между malloc и new
Вам нужно прочитать намного больше о C ++ , например, немного C ++ программирование книга и хороший C ++ справочник сайт. Да, C ++ - очень сложный язык (вам понадобятся годы работы, чтобы освоить его). Позже вы можете погрузиться в стандарт C ++ 11 n3337 (или более поздний стандарт C ++). Вам, безусловно, нужно понимать точно роль конструкторов и деструкторов (и объяснять, что это занимает много страниц, гораздо больше, чем можно разумно ожидать в любом ответе StackOverflow ).
Вам нужно иметь код ваших конструкторов для выполнения (и это делается с new
, но не с malloc
) - и позже деструкторы также должны быть выполнены, прежде чем освободить память. Деструкторы называются delete
(и во многих других случаях), но, конечно, не free
. Читайте также о правиле пяти и о RAII .
Если возможно, вы должны использовать интеллектуальные указатели . Иногда (например, для циклических ссылок) их недостаточно.
Бояться неопределенного поведения .
Инструмент valgrind полезен для поиска ошибок, связанных с памятью. Вы также должны скомпилировать все предупреждения и отладочную информацию, поэтому g++ -Wall -Wextra -g
с GCC . Вы также можете использовать статические анализаторы исходного кода, такие как clang-analyzer или Frama-C . Использование их может потребовать большого опыта; есть нет серебряной пули .
Ваш struct Record_array
неправильный: предпочитайте использовать std::vector<Record>
. Узнайте больше о стандартных контейнерах C ++ .
Конструктор вашего Record
будет вызывать конструктор str1
и str2
(чтобы он, конструктор std::string
, применялся в двух разных местах). Если вы не называете это конструктором Record
, str1
и str2
остаются в каком-то неопределенном состоянии (поэтому у вас есть некоторое неопределенное поведение , как только вы их используете).
Основное различие между malloc
& free
(для C) и new
и delete
(для C ++) заключается в способе участия конструкторов и деструкторов. Конечно, malloc
& free
игнорируют их, но не new
& delete
. Сбой выделения памяти (например, когда виртуальная память исчерпана) также обрабатывается по-разному.
PS. На практике вы никогда не должны использовать malloc
в коде C ++ , за исключением - только в редких случаях - при определении собственного operator new
. Потому что malloc
не вызывает конструкторы C ++ (а new
делает). Также, пожалуйста, поймите, что C и C ++ разные языки программирования , а malloc
для C, а не C ++. Многие реализации C ++ стандартной библиотеки являются , использующими malloc
в их реализации стандарта ::operator new
и использующими free
в их ::operator delete
.