Использование malloc вместо новых вызывает free (): ошибка неверного указателя

Если вам нужно, чтобы он был непрерывным, вы можете настроить setTimeinterval следующим образом

<?php
setInterval(function (){
$('div').animate({width: 'toggle'});
},200);
?>
-4
задан πάντα ῥεῖ 10 March 2019 в 07:22
поделиться

1 ответ

Я не понимаю разницу между 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 -s применялся к двум разным местоположениям). Если вы не вызываете этот конструктор Record, str1 и str2 останутся в неопределенном состоянии (поэтому у вас будет некоторое неопределенное поведение , как только вы их используете).

Основное различие между malloc и amp; free (для C) и new и delete (для C ++) - это способ привлечения конструкторов и деструкторов. Конечно, malloc & amp; free игнорируют их, но не new & amp; [+1121]. Отказ выделения памяти (например, когда виртуальная память исчерпана) также обрабатывается по-другому.

[1 165] PS. На практике вы никогда не должны использовать malloc в коде C ++ , за исключением - только в редких случаях - при определении своего собственного operator new. Потому что malloc не вызывает конструкторы C ++ (но new делает). Также, пожалуйста, поймите, что C и C ++ - это разные языки программирования , и malloc для C, а не C ++. Многие реализации стандартной библиотеки C ++ используют malloc в своей реализации стандарта ::operator new и используют free в своих ::operator delete. ​​

0
ответ дан Basile Starynkevitch 10 March 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: