首页 > 代码库 > C++中为啥ifstream不用new,用完还不用delete

C++中为啥ifstream不用new,用完还不用delete

刚从C#开始转C++,有很多东西不理解,如下边这段代码:

  #include <fstream>
  #include <iostream>
  
  int main() {
     using namespace std;
     ifstream file;
     basic_ifstream <wchar_t> wfile;
     char c;
     // Open and close with a basic_filebuf
     file.rdbuf()->open( "basic_filebuf_close.txt", ios::in );
     file >> c;
     cout << c << endl;
     file.rdbuf( )->close( );
  
     // Open/close directly
     file.open( "iotest.txt" );
     file >> c;
     cout << c << endl;
     file.close( );
  
     // open a file with a wide character name
     wfile.open( L"iotest.txt" );
  
     // Open and close a nonexistent with a basic_filebuf
     file.rdbuf()->open( "ziotest.txt", ios::in );
     cout << file.fail() << endl;
     file.rdbuf( )->close( );
  
     // Open/close directly
     file.open( "ziotest.txt" );
     cout << file.fail() << endl;
     file.close( );
  }

下边是我跟大牛的聊天记录,疑问解开。(有个大牛帮解答疑问感觉就是爽啊!)

skyline wolf 2014/8/11 9:35:42 有2个疑问
ifstream file;
file.open( "iotest.txt" );
file.close( );
1.这里没有new就可以调用file的方法吗?
2.用完之后,调用file.close(),最终不用delete是为什么?

大牛 2014/8/11 9:33:55
自己再想想。new是干什么的

skyline wolf 2014/8/11 9:35:42
new是用来创建对象,在堆上分配内存空间的。你的意思是说这个ifstream是模板所以不用吗?
9:36:22
大牛 2014/8/11 9:36:22
new的理解对。这个对象是在栈上声明的

skyline wolf 2014/8/11 9:38:19
你的意思是说,如果一个对象在前边只是声名了一下,那么这个声名的变量就被分配在了栈上。如果声名的时候用new就分配在堆上。是这样吗?
9:38:40
大牛 2014/8/11 9:38:40
是的

大牛 2014/8/11 9:39:09
栈上的对象不用delete。

skyline wolf 2014/8/11 9:39:15
哦,那第二个问题就清楚了。第一个问题还是不解理,

skyline wolf 2014/8/11 9:39:37
栈上的对象不用delete我是知道的

skyline wolf 2014/8/11 9:40:16
哦,是不是C++使用了默认构造函数?

skyline wolf 2014/8/11 9:40:38
在调用 前初始化了这个对象
9:41:46
大牛 2014/8/11 9:41:46
是的
你在构造函数里面设个断点观察下

skyline wolf 2014/8/11 9:43:01
3Q,清楚了。嗯,这个调试方法挺好的。