Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

CStdioFile - bad ptr (Visual C++)

612  1 2 3 4 5 6 7 8 9 все
voxel3d коренной житель12.05.06 15:45
voxel3d
NEW 12.05.06 15:45 
в ответ Simple 12.05.06 15:39
Вряд ли. Для каждого элемента последовательности вызывается string operator( const line& l ) из функтора, компилятор должен создавать временный объект-функтор при этом.
Dropbox - средство синхронизации и бэкапа файлов.
  scorpi_ скептик12.05.06 15:47
12.05.06 15:47 
в ответ voxel3d 12.05.06 15:35
Не, один раз. Иначе и строки бы не считались. Его можно впрочем и явно создать, я так делаю, когда мне данные из него позже нужны:
В ответ на:
	funct f( someargs );
transform( istream_iterator<line>( ifstream("source.txt") ),
istream_iterator<line>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
f );
// use f


  scorpi_ скептик12.05.06 15:49
NEW 12.05.06 15:49 
в ответ voxel3d 12.05.06 15:45
временный объект-функтор создаётся ещё до вызова transform, там же sequence point.
voxel3d коренной житель12.05.06 15:51
voxel3d
NEW 12.05.06 15:51 
в ответ scorpi_ 12.05.06 15:47
Ммм, а почему он один раз созда╦тся? Это результат оптимизации компилятором или в стандарте есть что-то по-поводу?
Dropbox - средство синхронизации и бэкапа файлов.
Simple Nothing is f*cked12.05.06 15:53
Simple
12.05.06 15:53 
в ответ voxel3d 12.05.06 15:51
Так transform же вызывается только один раз :-О
  scorpi_ скептик12.05.06 15:54
NEW 12.05.06 15:54 
в ответ Simple 12.05.06 15:35
Я даже когда MFC использую пишу почти всё на стандартном С++. Даже такую вот фигню писал, чтобы держать члены диалога в стрингах:
В ответ на:
void AFXAPI DDX_String( CDataExchange* pDX, int nIDC, std::string& value )
{
HWND hWndCtrl = pDX->PrepareEditCtrl( nIDC );
if ( pDX->m_bSaveAndValidate )
{
std::vector< char > v( ::GetWindowTextLength( hWndCtrl ) + 1, 0 );
::GetWindowText( hWndCtrl, &v[0], v.size() );
value = std::string( &v[0], v.size() - 1 );
}
else
SetWindowText( hWndCtrl, value.c_str() );
}


Simple Nothing is f*cked12.05.06 15:57
Simple
NEW 12.05.06 15:57 
в ответ scorpi_ 12.05.06 15:54
Судя по тому, что я сегодня узнал, стандартные классы гораздо мощнее MFC-подобных, так что это логично, если хорошо знаешь STL.
voxel3d коренной житель12.05.06 16:02
voxel3d
NEW 12.05.06 16:02 
в ответ Simple 12.05.06 15:53
transform тут не прич╦м. transform это движение source, dest итераторов, запись в объект, на который указывает dest итератор разультата вызова operator() функтора, которому переда╦тся объект, на который указывает source итератор.
Dropbox - средство синхронизации и бэкапа файлов.
Simple Nothing is f*cked12.05.06 16:08
Simple
NEW 12.05.06 16:08 
в ответ voxel3d 12.05.06 16:02, Последний раз изменено 12.05.06 16:12 (Simple)
Че-то я плохо понимаю, о чем ты. Мне представляется, что transform - это обычная функция, а раз так, то и объект создается только один раз.
voxel3d коренной житель12.05.06 16:19
voxel3d
NEW 12.05.06 16:19 
в ответ Simple 12.05.06 16:08
Какой именно объект?
Я сказал о том, как работает функция transform. Там никакие объекты не создаются. Вернее, созда╦тся объект, как оказалось один, но компилятором, неявно. Короче, мой вопрос сводится к тому, что, каково время жизни объекта, при следующем вызове: SomeClass(); где SomeClass -- имя класса.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:24
Murr
12.05.06 16:24 
в ответ voxel3d 12.05.06 16:19
При хорошем компайлере - ноль - вызов конструктора будет исключен(?) при оптимизации.
При среднем - быдет вызван конструктор и следом - деструктор.
При плохом, а большинство делает именно так - деструктор будет вызван при выходе из области определения.
Если надо точнее - надо рыть стандарт и доки на реализацию...
Simple Nothing is f*cked12.05.06 16:26
Simple
12.05.06 16:26 
в ответ voxel3d 12.05.06 16:19
Временный объект-функтор :) Он создается перед тем, как вызывается transform, как ты и сказал. Время жизни - 0.1 :) Копия передается transform'у и отмирает после ее окончания.
  scorpi_ скептик12.05.06 16:28
NEW 12.05.06 16:28 
в ответ voxel3d 12.05.06 15:51
В ответ на:

1.9 (8)
Once the execution of a function begins, no expressions from the calling function are evaluated until execution of the called function has completed.
1.9 (17)
When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body.
5.2.2 (4)
When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. ... The lifetime of a parameter ends when the function in which it is defined returns.
5.2.2 (8)
The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.

То бишь funct() создаётся до исполнения transform, и живёт до её конца.
Simple Nothing is f*cked12.05.06 16:28
Simple
NEW 12.05.06 16:28 
в ответ Murr 12.05.06 16:24
Зачем так глубоко копать? Тут все просто: функция получает копию объекта, сам объект пьот йад, не отходя от кассы :-D Какие к-ры/д-ры вызываются - возле птицы.
Murr коренной житель12.05.06 16:30
Murr
12.05.06 16:30 
в ответ JacksonB 11.05.06 15:35
Разумеется. Он ведь не дает _сторонних_ эффектов?
Murr коренной житель12.05.06 16:31
Murr
NEW 12.05.06 16:31 
в ответ voxel3d 12.05.06 16:19
Интересно - это я глючу? Или???
P.S. Второй раз на этой ветке...
  scorpi_ скептик12.05.06 16:31
NEW 12.05.06 16:31 
в ответ Murr 12.05.06 16:24
При любом компайлере будут созданы временные объекты классов istream_iterator, ifstream, ostream_iterator, ofstream и funct.
voxel3d коренной житель12.05.06 16:34
voxel3d
NEW 12.05.06 16:34 
в ответ scorpi_ 12.05.06 16:28
Вс╦, понял, с количеством вызовов вопрос закрыт - пятница, туплю.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:35
Murr
NEW 12.05.06 16:35 
в ответ Simple 12.05.06 16:28
Тут все просто: функция получает копию объекта
------
Это тебе так хочется. Тем не мение - построение объекта и передача объекта в качестве параметра есть несколько разные операции и между ними вполне может произойти куча всякой всячины.. ну и такая малость, как вызов деструктора объекта...
voxel3d коренной житель12.05.06 16:35
voxel3d
NEW 12.05.06 16:35 
в ответ Murr 12.05.06 16:31
Да, не, я удалил сообщение, до меня дошли ответы.
Dropbox - средство синхронизации и бэкапа файлов.
1 2 3 4 5 6 7 8 9 все