Проблема не связана с lambdas или std :: function, а скорее с семантикой delete. Этот код имеет ту же проблему:
class A;
class B {
public:
B(A *a_) : a(a_) {}
void foo();
private:
A *const a;
};
class A {
public:
A() : b(new B(this)) {}
~A() {
delete b;
}
void foo() { b->foo(); }
private:
B *const b;
};
void B::foo() {
delete a;
}
int main() {
A *ap = new A;
ap->foo();
}
Проблема заключается в семантике удаления. Разрешено ли снова загружать операнд из памяти после вызова его деструктора, чтобы освободить его память?
Вы получите эту ошибку, когда word
- пустая строка.
Это произойдет, если у вас есть два неалфавитных символа подряд. После проверки первой буквы вы назначаете word = ""
. Затем, когда вы обрабатываете следующий символ, word
остается пустым, поэтому нет word[0]
.
Если первая буква по крайней мере "h" `, то то же самое относится и к целому слову, поэтому его не нужно индексировать. Просто напишите:
if word.lower() >= "h":
Или вы можете проверить, есть ли что-нибудь в word
первым:
if word and word[0].lower() >= "h":
Нет необходимости писать "h".lower()
. Это уже строчные.
Так как вам нужно повторно инициализировать word
независимо от того, начинается ли он с буквы в диапазоне или нет, уберите это назначение
Таким образом, исправленный код должен быть:
for letter in sentence:
if letter.isalpha():
word += letter
else:
if word and word[0].lower() >= "h":
print(word.upper())
word = ""