Вы создаете свой экземпляр b
в куче
b *b_object = new b();
Это означает, что вы несете ответственность за его удаление, когда вы больше не используете его
b* b_object = new b();
/* use b_object here */
delete b_object;
Безвызов delete
, деструктор не вызывается, то есть деструктор ofstream
не вызывается, что вызвало бы сброс потока, записывающего сообщение в файл.Когда вы создали экземпляр ofstream
как глобальный внутри вашего b.cpp
, компилятор отвечал за вызов его деструктора, поэтому он работал.
Не управляйте памятью самостоятельно, используйтеумный указатель
#include <memory>
auto smart_ptr = std::make_unique<b>();
smart_ptr->b_write("hello happy b");
Он будет вызывать delete
для вас.
Еще лучше, на самом деле нет причин, по которым вам следует выделять память в куче, если вы создали своюэкземпляр b
в стеке, компилятор сделает все за вас, благодаря RAII.
int main(){
b b_object;
b_object.b_write("hello happy b");
}