Не вижу определения shTask . Такое возможно только при пустом умолчательном конструкторе. Иначе, этот код содержит скрытую ошибку, которая себя ещё проявит.
struct shTask
{
bool status;
uint32_t timer;
uint32_t interval;
shCallback callback;
};
И чтобы два раза не вставать ))
typedef void (*shCallback)(void);
А, ну, здесь-то, пожалуйста. тут нет конструктора. У того, класса, что выше был, вроде был конструктор с параметром пин. И вот вызвать его при таком создании экземпляра довольно непросто (я уж не говорю, про наследуемы классы, да ещё с виртуальными методами).
Понятно, значит отринем прошлое, new - так new ))
Ну здесь все может быть еще веселее. Вот регулярно я подучиваю английский, хобби у меня такое. Так вот при изучении и понимании иностранного языка надо знать как минимум три важных аспекта 1- логика мысли(или контекст), 2-грамматика мысли(или какой порядок слов) 3- это языковый регистр(официальный юридический или бытовой, а иногда сленг, феня и так далее).
Ну с переамбулой закончим. Теперь как это в программировании. Ну контекст(1) это и есть железо и ТЗ что мы пытаемся городить.Порядок слов и предложений (2) это все вредный язык С/С++ и его очень необычная “грамматика”
И наконец языковый регистр(3). На нижних уровнях модулей программы может применяться ассемблер, или конструкции просто Си для увеличения производительности системы. Но на верхних только выверенные слова и грамматические конструкции. И это new/
Блин, сколько умных слов!
На всякий случай привожу полный текст оператора new и Arduino IDE 2.2.1, чтобы все видели сколь разительно new отличается от простого malloc. (это вариант для МК у которых нет исключений)
static void * new_helper(std::size_t size) {
if (size == 0) size = 1;
return malloc(size);
}
void * operator new(std::size_t size) {
void *res = new_helper(size);
return res;
}
А это для каких случаев?
А как ты ноль чего-то сможешь выделить? ))
можно и NULL вернуть при нуле.
Видимо нельзя у
а если malloc вернет NULL?
Ну так и new тогда вернет NULL
Раньше (в IDE 1.x) этого не было. Сейчас добавили.
Вообще, это для устранения неопределённости и, главное, для устранения проблем при создании экземпляров объекта.
По поводу неопределённости: стандарт С++ говорит, что эти библиотеки наследуются от Си, а в стандарте Си сказано:
"If the size of the space requested is zero, the behavior is implementation-defned: either a null pointer is returned to indicate an error, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object. (ISO/IEC 9899:2018, §7.22.3)
По поводу же не проблем с экземплярами, дело тут в том, что экземпляр не может иметь нулевой размер хотя бы потому, что он должен иметь this, который на что-то разумное указывает.
Тогда, если выполнять требования стандарта (выше) невозможно создать экземпляр объекта, у которого есть только методы (не виртуальные), но нет свойств. Его длина получается нулевой, значит либо надо выдавать ошибку при попытке создания, либо возвращать указатель, который не может использоваться как this, т.к. он “shall not be used to access an object”.
И как быть? Выкручиваются по-разному. Одно из решений вот такое – всегда запрашивать хотя бы один байт. Тогда this на него укажет и проблемы нет.
P.S. Кстати, тут есть простор для “настоящих мужчин”. В классе можно определить свой new и свой sizeof. При этом никто не контролирует, что new запрашивает именно столько памяти, сколько возвращает sizeof (программист определил – ему виднее как надо). Поэтому запрашивать создание массивов таких объектов – истинное, ничем не замутнённое удовольствие ![]()
это понятно, вопрос был
и почему тут не вернуть NULL
почему тут не вернуть NULL
Ответ см. выше.
Не совсем понял реплики, но для тех МК, где есть исключения, в функции new вызывается исключение вместо возврата NULL. Во её полный (ни байта не убирал) текст
void * operator new(std::size_t size) {
void *res = new_helper(size);
#if defined(NEW_TERMINATES_ON_FAILURE)
if (!res)
std::terminate();
#endif
return res;
}
Напоминаю, это Arduino IDE 2.2.1,
Евгений Петрович я просто использовал вашу цитату, не более ![]()
В любом случае, я не понял что именно “видимо нельзя”
Не хотел тебя огорчать, но “видимо” придётся…)
Вот это я и имел ввиду про языковые регистры. При переходе в программировании на верхние модули программисты подымают регистр языка, скрывая не очень приглядную картину и делая вид что программы придумывать писать просто. В тексте программы ЕвгенияП это видно (что скрывают программисты
). Это как Вы идете в мясной отдел, где все мясо очищено и распотрашено . А ведь до этого были сцены массового забоя живности, которые всем видеть не желательно.