Переменная timeOld используется без инициализации в c ++ - PullRequest
0 голосов
/ 12 марта 2012
char* timeNew = _com_util::ConvertBSTRToString(cpi->getTime());
if(timeFirst == true)
    {
    strcpy(timeOld,timeNew);
    timeFirst = false;
    }

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

Ответы [ 3 ]

1 голос
/ 12 марта 2012

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

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

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

std::string timeNew(_com_util::ConvertBSTRToString(cpi->getTime()));
if(timeFirst == true)
{
     timeOld=timeNew;
     timeFirst = false;
 }
1 голос
/ 12 марта 2012

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

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

или вы можете сделать timeOld a 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(), если действительно требуется.

0 голосов
/ 12 марта 2012

Если вам нужно использовать ConvertBSTRToString, тогда используйте boost::scoped_array<char> или boost::shared_array<char> для обеспечения очистки.

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

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

...