Как работает распределение переменных в C++?

У меня это в теле main.cpp (как оно называется? глобально?)

ofstream s;
...
int main ... {
    s = ofstream("somefile.txt");
...

затем другой поток использует его один раз в день для ролловера:

s.close();
// do I need to cleanup in between?
s = ofstream("anotherone.txt");

нужно ли очищать перед creating новым потоком?

Вы спрашиваете, есть ли какая-то общая концепция «очистка переменных» в C++, или вы спрашиваете конкретно о механике класса ofstream?

Sneftel 09.04.2022 17:49

любой объект - нужно ли его как-то удалять? не будет ли утечки памяти после s = ofstream("anotherone.txt");?

Boppity Bop 09.04.2022 17:54

Я думаю, это зависит от того, насколько хорошо определен класс. Но, говоря простым языком, сравните с базовым типом: int* p = new int; *p = 3; /* .do stuff */ *p = 4; delete p; У нас здесь утечка памяти? Должны ли мы удалять p и создавать заново между двумя заданиями?

Adrian Mole 09.04.2022 18:03

NB: это не класс. это просто файл cpp с main внутри, а s объявлен снаружи main. также вы используете new - я знаю, что с этим делать. Я не знаю, что делать с var, который объявлен просто как T v, а затем v = T(); <- это то же самое, что v = new T() ?? тогда я должен использовать delete &v? не уверен, что он скомпилируется

Boppity Bop 09.04.2022 18:07
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
4
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

close() — это функция-член, определенная в классе ofstream. Это не деструктор; в нем нет ничего особенного, что принципиально важно для правил языка C++. Если на то пошло, s = ofstream("anotherone.txt") на самом деле просто другой способ написания строки кода s.assignment_operator(ofstream("anotherone.txt")), за исключением того, что вместо assignment_operator она пишется operator=. (Обратите внимание, что в этом случае значение, которое передается функции-члену, является временным значением и уничтожается после возврата из функции. Это не обязательно означает что-то конкретное о том, что происходит при открытии и закрытии файлов; язык работает)

Глобальная переменная существует на протяжении всей жизни программы; точная семантика во время запуска и завершения работы немного сложна, но, безусловно, во время «основной фазы» они всегда существуют. Дизайн ofstream может переводить s в другое состояние при вызове s.close(), но это полностью зависит от дизайна ofstream, и это то, что вы обнаружите, прочитав документацию этого класса, а не прочитав правила язык.

благодарю вас. но мне все равно непонятно. мне нужно просто да или нет - если я "назначу" var как s = class_a("somefile.txt"); и позже s = class_a("anotherone.txt"); - будет ли утечка памяти? или компилятор С++ умно написал какое-то освобождение для somefile экземпляра var перед назначением anotherone ?

Boppity Bop 09.04.2022 18:18

@BoppityBop Если рассматриваемый класс хорошо написан, ваш вопрос «да/нет» аналогичен вопросу «Если я назначу переменную типа int s = 2; и позже s = 4;, будет ли утечка памяти?»

JaMiT 09.04.2022 18:28

idk, как вы сравниваете класс с целым числом, но хорошо. да это я и спрашиваю.

Boppity Bop 09.04.2022 18:31

@BoppityBop: То, как «вы сравниваете класс с целым числом», является более или менее определением хорошо написанных классов на C++.

Davis Herring 09.04.2022 19:19

@BoppityBop Опять же, все сводится к тому, как реализован рассматриваемый класс. Как это бывает, ofstream ведет себя «хорошо»; он полагается на "переместить семантику", введенный в C++11, чтобы присваивание «просто работало». Но Стандартная библиотека в целом была написана умными людьми, так что тот не так-то просто облажаться почти со всеми ее средствами.

Sneftel 09.04.2022 21:19

Другие вопросы по теме