2014-02-07 2 views
0

В соответствии с документацией для макросов преобразования OLE MSDN, если мы используем макрос в цикле for, например, он может выделить больше памяти в стеке, что приведет к переполнению стека.OLE macro in a for loop

Это пример, приведенный на MSDN

void BadIterateCode(LPCTSTR* lpszArray) 
{ 
    USES_CONVERSION; 
    for (int ii = 0; ii < 10000; ii++) 
     pI->SomeMethod(ii, T2COLE(lpszArray[ii])); 
} 

В приведенном выше примере T2COLE используется внутри для цикла, который может привести к переполнению стека, чтобы избежать этого вызов метода инкапсулируется в функцию как этот

void CallSomeMethod(int ii, LPCTSTR lpsz) 
{ 
    USES_CONVERSION; 
    pI->SomeMethod(ii, T2COLE(lpsz)); 
} 

void MuchBetterIterateCode2(LPCTSTR* lpszArray) 
{ 
    for (int ii = 0; ii < 10000; ii++) 
     CallSomeMethod(ii, lpszArray[ii]); 
} 

Можем ли мы просто отправить LPCTSTR другой функции вместо герметизирующего весь метод, как это,

LPCOLESTR CallSomeMethod(LPCTSTR lpsz) 
{ 
    USES_CONVERSION; 
    return T2COLE(lpsz); 

} 

void BadIterateCode(LPCTSTR* lpszArray) 
{ 
     for (int ii = 0; ii < 10000; ii++) 
     pI->SomeMethod(ii, CallSomeMethod(lpszArray[ii])); 
} 

Может ли кто-нибудь сказать мне, безопасно ли использовать макрос OLE или все же мы можем столкнуться с переполнением стека?

Будут ли какие-либо другие проблемы с использованием вышеуказанного метода?

ответ

0

Третий пример не будет работать, так как объект, созданный в методе, будет уничтожен, как только вы вернетесь из функции. Как вы заметили в своем вопросе, объект создается в стеке, и в этой ситуации применяются обычные правила стека - объект будет уничтожен, как только вы выйдете из области видимости, и вы получите доступ к данным мусора в третьем дело.

Второй случай - это правильный механизм для использования данных без запуска переполнения стека, как при возврате из функции, память, выделенная T2COLE, будет освобождена.

Я не знаю, как работает реализация T2COLE, но в C вы можете добиться такого же поведения, используя функцию alloca, которая страдает от одной и той же проблемы - как только вы вернетесь из функции, вы должны рассмотрите указатель и данные, которые он указывает как недействительные.