2

似乎不像ifstream*->open我预期的那样工作......这是代码:(g++ 4.7使用-std=c++11in编译MAC OSX 10.7

#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
    string line;
    vector<string> fname = {"a.txt","b.txt"};
    vector<ifstream*> files ( 2, new ifstream );

    files[0]->open( fname[0] );
    getline( *files[0], line,  '\n');
    cerr<<"a.txt: "<<line<<endl; 
    //this one prints the first line of a.txt

    line.clear();

    files[1]->open( fname[1] );
    getline( *files[1], line, '\n'); 

    cerr<<"b.txt: "<<line<<endl;
    //but this one fails to print any from b.txt
    //actually, b.txt is not opened!

    return 0;
}

谁能告诉我这里出了什么问题???

4

1 回答 1

5

new std::ifstream在使用时执行一次,而不是每个2您请求的值执行一次。

创建一个 ifstream 指针,其指针值被构造函数new std::ifstream插入两次。filesstd::ifstream

std::vector只处理它包含的对象,在这种情况下是ifstream*指针。因此,2复制指针值。当files超出范围时,会处理指针(以及向量中的支持数据),但不会处理指针指向的值。因此,vector 不会删除您的新std::ifstream对象(两次放置在 vector 中)。

operator delete不需要你,因为指针可以有很多不容易确定的用途。其中之一是故意将相同的指针两次放入向量中

于 2012-09-17T17:30:25.283 回答