C ++ ifstream указатель открыть файлы не удается

Это похоже на 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;
}

Кто-нибудь может сказать мне, что здесь не так ???

2

Решение

Это выполняет new std::ifstream один раз, когда используется, а не один раз в 2 значения, которые вы просили.

new std::ifstream создает указатель ifstream, значение указателя которого вставляется два раза в files посредством std::ifstream конструктор.

std::vector заботится только об объектах, которые он содержит, которые в этом случае ifstream* указатели. Итак 2 копирует значение указателя когда files выпадает из области видимости, учитываются указатели (и поддерживающие данные в векторе), но не значения, на которые указывают указатели. Таким образом, вектор не удаляет ваш новый std::ifstream объект (помещается в вектор дважды).

operator delete не для вас, потому что указатели могут иметь много целей, которые не могут быть легко определены. Один из которых заключается в том, чтобы поместить один и тот же указатель в вектор дважды нарочно.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]