• 0

[C++] Close All Open Streams


Question

Is there a way in C++ to close all open streams without directly referencing the stream:

e.g. filestream.close();

I ask because I have a program where one of my file streams in not in scope when I call exit(-1) to terminate my program. The file stream is a member of a class and I would like to avoid having to pass around another reference to the class. Anyway to do something like:

cin:streams.close();

???

Lastly, does it even matter if I close it, or will it get closed by destructors when I call exit(-1)? Thanks

Link to comment
https://www.neowin.net/forum/topic/620937-c-close-all-open-streams/
Share on other sites

9 answers to this question

Recommended Posts

  • 0

If you're using gcc or STLport, it is automatically closed. From the gcc-3.4.5 (MinGW) header:

	  /**
	   *  @brief  The destructor closes the file first.
	  */
	  virtual
	  ~basic_filebuf()
	  { this->close(); }

You might look into your header files to determine the answer. That was found in the fstream header, so the code for the destructor might be in the same header.

  • 0
  rpgfan said:
If you're using gcc or STLport, it is automatically closed. From the gcc-3.4.5 (MinGW) header:

	  /**
	   *  @brief  The destructor closes the file first.
	  */
	  virtual
	  ~basic_filebuf()
	  { this->close(); }

You might look into your header files to determine the answer. That was found in the fstream header, so the code for the destructor might be in the same header.

But a destructor gets called when you either delete or go out of scope. Calling exit() does neither, it bypasses any C++ exit code that gets run when your program (main()) goes out of scope.

You can try it with the following code:

#include <stdlib.h>

#include <iostream>

class MyTest {
public:
	MyTest() { std::cout << "Constructor" << std::endl; }
	~MyTest() { std::cout << "Destructor" << std::endl; }
};

int main() {
	MyTest test;

	exit(-1);

	return 0;
}

First run without the exit(-1), then with and you'll see the difference. Basically, don't use exit() in C++.

  • 0

If I don't use exit(-1) to kill the program, is there some safer alternative that won't require exceptions or passing around a lot of extra variables?

Here's what I'm trying to do:

//Generic error message thrower and application exiter
void stopWithError(string s)
{
	cout << "ERROR: " << s << endl << "Terminating Parser.";
	Tokenizer *t = Tokenizer::Instance();  //Instance returns a Singleton, so this is good
	t->closeInput();
	//I have a ParseTree class that also has closeInput() function
	//, however, it doesn't use the Singleton
	//pattern, so I can't easily get a reference to the ParseTree class
	// -- and I call this function
	//from many different places.
	//I want to be able to do these 2 lines as well, but am not sure how to w/o passing
	//the parsetree object around all the time.  Is there any other way?
	//	 parsetree->closeInput();
	//	 delete parsetree;
	exit(1);
}

  • 0

You could make it so that each instance of your class adds an instance of the stream to a static vector. You could then add a static function that loops through the vector and closes everything.

Using a setjmp/longjmp back to main() (so that you could return and run all the destructors) would probably be an option as well.

  • 0
  itsnotabigtruck said:
You could make it so that each instance of your class adds an instance of the stream to a static vector. You could then add a static function that loops through the vector and closes everything.

I was thinking the same thing. Have a singleton with a factory method to allocate your streams and keep track of them, and a have a closeAll to close all your streams or a close method to close individual ones.

As for using setjmp/longjmp, avoid it for the same reason as exit(). You'll bypass destructors that get called when your functions go out of scope.

OP: Are you by any chance writing a compiler (I am)? If so, you could probably restructure your code to avoid all this hassle. Also, if you're catching and report errors in parsing and then quitting, it's better to try and recover from parsing errors than just quitting.

  • 0

Thanks for the static vector idea - I'll probably go with that due to my class deadline.

I am in fact writing an interpreter (not a compiler) for a made up language (oh boy). I'm very interested in the code restructuring idea. Can you explain what the general idea would be? Also, what are some general techniques for recovering from parsing errors without quitting? Do you have to be looser with your language grammar? Thanks.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Windows 11 gets 1Password passkey integration, version 25H2, and more with the latest builds by Taras Buria Microsoft is finishing this week with a now typical build duo for the Dev and Beta Channel users. For Windows Insiders in the Dev Channel, Microsoft is rolling out build 26200.5670; for those in the Beta Channel, Microsoft prepared build 26120.4520. Both updates have nearly identical changelogs with a new 1Password passkey integration, bug fixes, and more. Another important thing worth noting is that build 26200.5670 is the first officially confirmed Windows 11 version 25H2 build. 25H2 is this year's Windows 11 annual feature update, and it is now properly communicated in Settings > System > About and in the winver dialog. Note that the Beta build is still based on version 24H2. As for 1Password, customers who use this password manager can now enjoy a more seamless passkey experience. Windows Security will use passkeys stored in your 1Password and save new passkeys there as well. However, this change requires installing 1Password Beta for Windows 11. Here are other changes included in today's builds that are rolling out gradually: [Voice access] We are temporarily disabling support for Japanese to iron out a few more bugs. [Settings] In addition to the small changes that we made in the EEA region for default browsers via Settings > Apps > Default apps with Build 26200.5603, we’re also making this change: The new default browser will be pinned to the Taskbar and Start menu unless you choose not to pin it by clearing the checkboxes. [File Explorer] Fixed an issue which could cause File Explorer Home to crash (potentially also making File Explorer crash on launch, since Home is the default section for File Explorer). Fixed an issue which could cause the thumbnail for a pinned favorite in Home to disappear. [Start menu] Fixed an issue which was causing duplicate entries to appear when interacting with folders on the Start menu. Fixed an issue where the folder expand animation wasn’t correct in some cases. [Input] Fixed a high hitting ctfmon.exe crash in the latest flights, which could impact the ability to type. [Other] Fixed a memory leak which could happen when lock screen was set to use a slide show, which could impact performance and reliability over time. Did some more work improving how dialogs in the system react to increased text scaling, for example the “You must restart your computer to apply these changes” dialog should now support it. Here are the fixes that are available to all: [General] Fixed the issue causing the Windows Vista boot sound to play instead of the Windows 11 boot sound. Unfortunately the fix wasn’t completely working in the last Dev Channel flight. [File Explorer] Fixed the issue causing File Explorer to not persist view changes after the last Dev Channel flight, including desktop icons. And here is the list of known issues: [General] [UPDATED!]When joining the Dev Channel on Windows 11, version 24H2 – you will no longer be offered Build 26200.5641 first and will be offered the most current update available in the Dev Channel. [UPDATED!] When joining the Beta Channel on Windows 11, version 24H2 – you no longer will be offered Build 26120.4250 first and will be offered the most current update available in the Beta Channel. [UPDATED!] Some Windows Insiders may experience a rollback trying to install this update with a 0x80070005 in Windows Update. We’re working on a fix for Windows Insiders impacted. If you are impacted, using Settings > System > Recovery > “Fix issues using Windows Update” may resolve the issue. [Start menu] The following are known issues for Windows Insiders with the new Start menu: Using touch to navigate the new Start menu may not work reliably. For example, it currently does not support the swipe-up gesture. Drag and drop capabilities are limited from “All” to “Pinned.” [Xbox Controllers] Some Insiders are experiencing an issue where using their Xbox Controller via Bluetooth is causing their PC to bugcheck. Here is how to resolve the issue. Open Device Manager by searching for it via the search box on your taskbar. Once Device Manager is open, click on “View” and then “Devices by Driver”. Find the driver named “oemXXX.inf (XboxGameControllerDriver.inf)” where the “XXX” will be a specific number on your PC. Right-click on that driver and click “Uninstall”. [Click to Do (Preview)] The following known issues will be fixed in future updates to Windows Insiders: Windows Insiders on AMD or Intel™-powered Copilot+ PCs may experience long wait times on the first attempt to perform intelligent text actions in Click to Do after a new build or model update. [File Explorer] The following are known issues for AI actions in File Explorer: Narrator scan mode may not work properly in the action result canvas window for the Summarize AI action for Microsoft 365 files when reading bulleted lists. As a workaround, you can use Caps + Right key to navigate. [Widgets] Until we complete support for pinning in the new widgets board experience, pinning reverts you back to the previous experience. You can find the complete changelog for the Dev build here and for the Beta build here.
    • I'm in agreement with you here. I think the Windows Snipping Tool has the easiest highlight functionality to use. You literally select the highlighter and then just highlight. All other editors I have tried require some bizarre set of steps. So, 2 thumbs up'n'd'aya! for the Windows Snipping Tool with Idiot Proof Highlighter!
    • Microsoft officially confirms that Windows 11 version 25H2 is coming later this year by Usama Jawad Microsoft released Dev and Beta builds for Windows 11 today, and while the updates contain nearly identical change logs, one interesting observation is confirmation that Dev Channel users will be seeing Windows 11, version 25H2 in Settings > System > About and winver moving forward. Even though we had heard some whispers about it before, this is the first time that Microsoft has officially confirmed this next feature update to Windows 11. In a much more detailed blog post, Microsoft has made recommendations to organizations about how they can prepare for the arrival of Windows 11, version 25H2. The Redmond tech firm has highlighted that version 24H2 and version 25H2 both share the same Windows servicing branch, which means that the upgrade process should be fairly quick due to the presence of enablement packages (eKB). For those who don't know, enablement packages are bits and pieces of disabled code containing new features that are activated by Microsoft during a feature upgrade. This means that Windows 11, version 24H2 PCs can quickly update to version 25H2 in a single restart since the new code is already there, it just needs to be toggled on. That said, if you are utilizing a PC older than version 24H2, you won't be too happy to hear that it doesn't share the same servicing branch as version 25H2. What this means is that you'll have to go through the regular upgrade process through Windows Update or Windows Autopatch, which can be notably longer and require multiple restarts. As always, Enterprise versions of Windows 11, version 25H2 will receive 36 months of support starting from the release date, while Pro and Home variants will enjoy 24 months of support. It is worth keeping in mind that while Microsoft has confirmed that Windows 11, version 25H2 will begin rolling out later this year, it hasn't confirmed a concrete release date yet.
    • Mozilla fixes Firefox crashes on Windows by Taras Buria Mozilla is rolling out yet another update for the Firefox browser. Version 140.0.2 follows the just-released version 140.0.1 to address more bugs causing crashes on Windows in certain scenarios. Here is what the release notes say: Fixed a startup crash on Windows experienced by some users. (Bug 1974259) According to a post on Bugzilla, Mozilla's bug tracker for Firefox, the browser crashes with the ERROR_INVALID_HANDLE or ERROR_INVALID_PARAMETER error. This happens when Exploit Protection is enabled in Windows security settings. While that is a feature a regular user is unlikely to fiddle with, Exploit Protection is enabled for apps from the Microsoft Store. As such, crashes are most likely occurring for users with Firefox downloaded from the Microsoft Store. Still, if Exploit Protection is enabled globally, "standard" Firefox downloaded from the official website also fails. Note that the bug does not affect newer Firefox versions. Now, with Firefox 140.0.2 out, the browser should no longer crash regardless of your security settings or the browser origin. For reference, you can find the release notes for the latest update here; for version 140.0.1 (which fixed a couple of crash-inducing bugs), here; and for version 140.0 (a major release), here. As usual, you can update Firefox by heading to Menu > Help > About Firefox. The browser is available on the official website, in the Microsoft Store for Windows 10 and 11 users, or on Neowin's Software page.
    • They are always there, available third week every month, not fully public tho
  • Recent Achievements

    • Week One Done
      emptyother earned a badge
      Week One Done
    • Week One Done
      DarkWun earned a badge
      Week One Done
    • Very Popular
      valkyr09 earned a badge
      Very Popular
    • Week One Done
      suprememobiles earned a badge
      Week One Done
    • Week One Done
      Marites earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      563
    2. 2
      ATLien_0
      179
    3. 3
      +FloatingFatMan
      172
    4. 4
      Xenon
      122
    5. 5
      Som
      114
  • Tell a friend

    Love Neowin? Tell a friend!