Olej писал(а): ↑03 июн 2021, 19:50
Ещё более разительный пример
Ещё интереснее, тот образец, который я нашёл делая порученную ревизию файлов очень крупного (GIT репозиторий порядка 10 тыс. файлов, 3Gb) коммерческого проекта, успешно эксплуатирующегося крупнейшим мировым заказчиком-клиентом уже порядка 7 лет
...
- внутренняя член-переменная класса типа string (сохранённое состояние);
- конструктор класса создаёт объекты из текстовых строк char*;
- вот так:
Код: Выделить всё
#include <iostream>
#include <string>
using namespace std;
class aroud_text
{
public:
aroud_text(const char* t) : text(t) {}
friend ostream& operator <<( ostream& out, const aroud_text& obj )
{
return out << obj.text;
}
private:
string text;
};
int main()
{
const char *s1 = "<строка 1>";
aroud_text at1(s1);
cout << at1 << endl;
const char *s2 = "<строка 2>";
aroud_text at2(s2);
cout << at2 << endl;
const char *s3 = NULL;
aroud_text at3(s3);
cout << at3 << endl;
}
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/string_null$ make
g++ -Wall -pedantic -std=c++2a nullbase.cc -o nullbase
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/string_null$ ./nullbase
<строка 1>
<строка 2>
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Аварийный останов (стек памяти сброшен на диск)
Но и это ещё не всё!
В реальных достаточно объёмных проектах:
- переменная-член text будет описана в одном файле aroud_text.h ...
- а конструктор с инициализацией - в совершенно другом файле aroud_text.cpp ...
- и зачастую эти файлы находятся даже в разных каталогах!
В заголовочном файле aroud_text.h мы видим член-переменную text и
наличие конструктора, инициализирующегося строкой char* - всё ОК.
А в реализационном файле aroud_text.h, в конструкторе, мы видим инициализацию переменной text значением параметра - всё, кажется, ОК.
А складывая одно с другим - получаем жестокий крах приложения на выполнении, runtime, и необходимость разгребать дамп и выяснять где в нескольких тысячах строк кода это могло произойти.