2

ifstream*->open思ったとおりに動作しないようです...コードは次のとおりです:( inをg++ 4.7使用してコンパイル)-std=c++11MAC 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ごとに1回ではなく、使用された場合に1回実行されます。2

は、コンストラクターによってnew std::ifstreamポインター値が2回挿入されるifstreamポインターを作成します。filesstd::ifstream

std::vector含まれているオブジェクト(この場合はifstream*ポインター)のみを処理します。したがって、2ポインタ値をコピーします。スコープから外れるとfiles、ポインター(およびベクトル内のサポートデータ)は処理されますが、ポインターが指す値は処理されません。std::ifstreamそのため、vectorは新しいオブジェクトを削除しません(ベクターに2回配置されます)。

operator deleteポインタには簡単に判断できない多くの用途があるため、は呼び出されません。その1つは、意図的に同じポインタをベクトルに2回配置することです。

于 2012-09-17T17:30:25.283 に答える