Это похоже на ifstream*->open
не работает, как я ожидал …
Вот код: (скомпилировано с g++ 4.7
с помощью -std=c++11
в 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;
}
Кто-нибудь может сказать мне, что здесь не так ???
Это выполняет new std::ifstream
один раз, когда используется, а не один раз в 2
значения, которые вы просили.
new std::ifstream
создает указатель ifstream, значение указателя которого вставляется два раза в files
посредством std::ifstream
конструктор.
std::vector
заботится только об объектах, которые он содержит, которые в этом случае ifstream*
указатели. Итак 2
копирует значение указателя когда files
выпадает из области видимости, учитываются указатели (и поддерживающие данные в векторе), но не значения, на которые указывают указатели. Таким образом, вектор не удаляет ваш новый std::ifstream
объект (помещается в вектор дважды).
operator delete
не для вас, потому что указатели могут иметь много целей, которые не могут быть легко определены. Один из которых заключается в том, чтобы поместить один и тот же указатель в вектор дважды нарочно.
Других решений пока нет …