2012-03-12 2 views
0
char* timeNew = _com_util::ConvertBSTRToString(cpi->getTime()); 
if(timeFirst == true) 
    { 
    strcpy(timeOld,timeNew); 
    timeFirst = false; 
    } 

Как я могу инициализировать timeold, если я не знаю, какой размер массива символов возвращается cpi-> getTime?Переменная timeOld используется без инициализации в C++

+0

'if (timeFirst = true)'? Тьфу! –

+0

его глобальный bool –

+1

Предпочитаете 'if (timeFirst)'. Текст '== true' лишний и лишний. И избыточно. –

ответ

1

Выделяем память для него на основе длины timeNew:

delete[] timeOld; 
timeOld = new char[strlen(timeNew) + 1]; 

или вы могли бы сделать timeOld с std::string и пусть это управление памятью для вас:

std::string timeOld; 

timeOld = timeNew; // If timeNew is dynamically allocated you must still 
        // delete[] it when no longer required, as timeOld 
        // takes a copy of timeNew, not ownership of timeNew. 

Вы можете получить доступ к const char* с помощью std::string::c_str() если это действительно необходимо.

1

Используйте строки, где это возможно:

char *t= _com_util::ConvertBSTRToString(cpi->getTime()); 
std::string timeNew(t); 
delete[] t; 
if(timeFirst == true) 
{ 
    timeOld=timeNew; 
    timeFirst = false; 
} 

, если вы не должны управлять памятью, возвращаемой Teh функцией просто:

std::string timeNew(_com_util::ConvertBSTRToString(cpi->getTime())); 
if(timeFirst == true) 
{ 
    timeOld=timeNew; 
    timeFirst = false; 
} 
0

Если вы должны использовать ConvertBSTRToString затем использовать boost::scoped_array<char> или boost::shared_array<char> чтобы вы очистились.

boost::shared_array<char> time; 
time.reset(_com_util::ConvertBSTRtoString(cpi->getTime()); 

автоматически перераспределяется. Не требуется никаких вызовов для удаления или удаления [].

Смежные вопросы