2015-01-05 2 views
-1

У меня есть пример кода, как показано ниже ..Вставить символ * с новым в вектор C++

std::vector<char*> vNameList;//it will be defined globally.. 



int main(int argc, char* argv[]) 
{ 
CollectName(); 
    for(int i = 0; i<(int)vNameList.size(); i++) 
    { 
    printf("\n %s" , vNameList[i]);//Here gabage values are getting printed on console 
    } 
    return 0; 
} 

void CollectName() 
{ 
    char *Name = new char[sizeof(NAME)+1];//NAME datatype is defined having size of 32 char 

    //processing for Name is performed , which includes assigning Name variable with value.. 

    //now insert it into vector 
    vNameList.push_back(Name); 

    delete[] Name; //at this Name value inserted into vector become garbage 
} 

Я считаю, если мы инициализируем символ * с новым он должен быть удален, чтобы избежать утечек памяти. Но это приводит к изменению значений из вектора.

Пожалуйста, направляйте меня так, чтобы я мог исправить свой код, который даст мне правильные значения.

У меня есть ограничение на использование только Char *, поэтому предложите способ достичь этого с помощью char *.

+1

Ваш вектор пуст. Цикл не должен запускаться. – juanchopanza

+7

Зачем беспокоиться об этом в первую очередь? 'std :: vector ' будет делать все отлично. –

+0

Где вы называете 'CollectName' в вашем примере? – PiotrNycz

ответ

1

Вы можете исправить свой код, удалив указатели только после вы закончите использовать их (если вы на самом деле есть код, который использует указатели. Ваш пример кода ничего не печатает, мусор или иным образом).

Но это, как правило, лучше дизайн строк магазина символов в std::string и при сохранении std::string сек в std::vector, вам больше не нужно управлять памятью вручную.

1

Это потому, что имя массива трактуется как указатель в C++ (или c, оно унаследовано).

Поэтому, когда вы делаете

vNameList.push_back(Name); 

Он вставляет char * в вектор, то есть указатель на первый символ (анс, следовательно, строка) к вектору, но вы удаляете указатель после этого, поэтому вы получите мусор значения. Однако, если вы не удаляете указатель, он отлично работает, поскольку указатель все еще существует, но таким образом вы не освободите память. Поэтому: DONOT ИСПОЛЬЗОВАТЬ ЭТУ

здесь: LIVE EXAMPLE

Чтобы избежать этого хлопот: вы должны использовать

std::vector<std::string> vNameList; 

вместо этого.

+0

«если вы не удаляете указатель, он работает отлично» - пока вы найдете другой (надежный) способ исправить утечку. –

+0

@MikeSeymour, oops забыл упомянуть об этом, спасибо –

+0

@AbhishekGupta - я проверил его, чтобы стереть вызов, но это не вызовет утечки памяти? Я читал, что всякий раз, когда используется новый, он должен быть удален. – user987316

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