#c #memory-management
#c #управление памятью
Вопрос:
У меня возникла эта проблема с выделением массива некоторых объектов, которые мне нужно инициализировать с помощью некоторого конструктора. Позвольте мне показать, что я имею в виду:
ofstream* out = new ofstream[10];
for(int i = 0; i < 10; i ){
stringstream ss;
ss << "file" << i << ".txt";
string str(ss.str());
char *fileName = (char*)str.c_str();
out[i] = ofstream(fileName); //Now, this is wrong
}
И мне нужна некоторая помощь по wrong
отмеченной строке. Как мне выделить каждый элемент этого массива?
И спасибо, что не указали мне на другие сообщения (я многое просмотрел перед публикацией)
Комментарии:
1.
out
подвержен утечке памяти. Не забудьте вызватьdelete[]
out.
Ответ №1:
Избавьтесь от fileName
переменной и используйте out[i].open(str.c_str());
— и не забудьте delete[] out;
Комментарии:
1.
delete[]
также вызываетclose()
каждый поток в моем массиве?2. @iuliux: delete[] гарантирует, что вызывается деструктор каждого потока, который его закрывает.
3. Прохладный. Тогда пусть ваш ответ будет выбран, хотя @ Chris Kaminski также ответил нормально
Ответ №2:
Вот самое простое решение вашей проблемы.
out[i].open(fileName);
Ответ №3:
Вы могли бы оптимизировать это, удалив str
и fileName
:
out[ i ].open( ss.str().c_str() );
Кроме того, я бы рекомендовал вам использовать std::vector
, чтобы не переносить выделение и освобождение памяти.
std::vector< std::ofstream >
Комментарии:
1. Ну, я вроде как читал ранее, почему
ss.str().c_str()
не работает. Ребята говорили, что этоss.str
генерирует временный объект.2. Да? Это странно O.o Я не вижу в этом ничего плохого — да,
.str()
возвращает временный объект, но что? Он все еще «активен» при открытии файла (потока).3. Я только что запустил это в Visual Studio 2010, и даже предупреждений нет, все работает просто отлично 😕
Ответ №4:
Если вам действительно нужно вызвать конструктор к моменту вставки элемента (возможно, потому, что у вашего класса нет конструктора по умолчанию), попробуйте разместить new, как описано здесьhttp://www.parashift.com/c -faq-lite/ctors.html#faq-10.5