C выделяет массив объектов

#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