Поскольку требуется вызвать fann_destroy_train_data
, вы можете использовать C ++ и RAII, используя следующую обертку:
struct fann_wrapper
{
fann_train_data *td;
fann_wrapper(fann_train_data* p) : td(p) {}
~fann_wrapper() { fann_destroy_train_data(td); }
};
//...
for (int i = 1; i <= epochs; ++i) {
for (std::vector<std::filesystem::path>::iterator it = batchFiles.begin(); it != batchFiles.end(); ++it) {
struct fann_train_data *data = fann_read_train_from_file(it->string().c_str());
// the next line ensures that fann_destroy_train_data is called
fann_wrapper fw(data);
fann_shuffle_train_data(data);
float error = fann_train_epoch(ann, data);
} // when this curly brace is encountered, the fann_destroy_train_data is always called
}
fann_wrapper
просто содержит указатель fain_train_data
, и при уничтожении fann_wrapper
, fann_train_data
уничтожен.
Причина, по которой это намного безопаснее, чем метод C
, заключается в том, что может быть выдано возможное исключение (по любой причине). Если выдается исключение, то fann_train_data
будет всегда уничтожаться при использовании fann_wrapper
. Эту гарантию нельзя сделать с помощью метода C
, поскольку исключение полностью пропустит любую строку, содержащую fann_destroy_train_data
.
Пример:
for (int i = 1; i <= epochs; ++i) {
for (std::vector<std::filesystem::path>::iterator it = batchFiles.begin(); it != batchFiles.end(); ++it) {
struct fann_train_data *data = fann_read_train_from_file(it->string().c_str());
fann_shuffle_train_data(data);
float error = fann_train_epoch(ann, data);
fann_destroy_train_data(data); // this line is not executed if an exception is thrown above, thus a memory leak
}
}
Вот почему RAII является важной концепцией в C ++. Ресурсы будут очищаться автоматически, независимо от причины выхода исполняемого блока кода (генерируется исключение, выполняется return
и т. Д.).
О, как мне жаль, что не было единственного сайта, где реестр был коллективно зарегистрирован всеми, кто пишет значения там! Следует иметь в виду, любое приложение может создать свой собственный набор ключей реестра и значений, таким образом, это не просто MS, кто был бы необходим для такого усилия. Хотя они были бы ключевым игроком!
Тем временем, существует два сайта MS, которые я использую как стартовые точки, когда я должен знать, что конкретная пара ключ/значение сделайте:
ссылка реестра Windows 2003: http://technet.microsoft.com/en-us/library/cc778196.aspx
ссылка Реестра Windows 2000: http://technet.microsoft.com/en-us/library/cc974061.aspx
Имеет в виду, что, так как Windows является развивающейся вещью, даже информация о более старых версиях может быть очень полезной. Также обратите внимание, что W2003 имеет большое сходство XP. К сожалению, я не нашел ссылку на реестры Vista/Windows 2008 года подобной вышеупомянутому.
, Когда необходимо знать то, что произошло с определенным ключом, и это не найдено в одной из вышеупомянутых ссылок, попробуйте поиск полного пути того ключа в http://support.microsoft.com
Статья Википедии на самом деле довольно хороша. Не полный отчет всего, но не слишком потертый также. http://en.wikipedia.org/wiki/Windows_Registry
Я использовал этот справочный файл в прошлом. Очень хороший ресурс