2015-10-15 6 views
0

прежде всего извините меня за мой плохой английский.Значение lpcstr было повреждено при нажатии на вектор или список

У меня есть функция, которая генерирует список значений LPCSTR, и я хочу, чтобы добавить все каждый из них в list<LPCSTR> или vector<LPCSTR>, это мой пример кода:

vector<LPCSTR> output={}; // or list<LPCSTR> 

... 

for (....) 
{ 

    auto anItem = static_cast<LPSTR>(malloc(20)); 
    sprintf_s(anItem, 20, "string format", values...); 
    output.push_back(anItem); 

    /* The problem */ 
} //free(anItem); when i free the allocated memory of anItem then added item to output was being corrupt ! 

Если я освободить выделенную память то данные были повреждены, а у меня огромная неиспользуемая память! Если я замедляю auto anItem = static_cast<LPSTR>(malloc(20)); перед циклом, тогда все предметы, добавленные в ouput, были значением тока anItem !! И у меня есть список/вектор только одного значения !!!

, пожалуйста, помогите мне!> благодаря

ответ

0

Если у вас есть указатели, которые вы хотите положить в контейнер, у вас есть выбор.

  1. Просто скопируйте указатель, а затем, если то, что он указует будет удален другим путем кода, у вас есть «оборванный указатель» дает, казалось бы, испорченное содержимое как вы наблюдаете
  2. Используй смарт-указатель вместо
  3. Новых ваш собственный указатель и скопируйте содержимое и не забудьте очистить его в какой-то момент, иначе у вас будет память.
  4. Скопируйте содержимое указателя

В вашем случае, вы можете обнаружить, что проще всего скопировать LPCSTR в станд :: строку и вкладывать их в векторе.

0

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

Используйте vector<string> для хранения строк.

+0

Спасибо, А как насчет других указателей? например struct or .... – Robert

+0

Избегайте сырых указателей, как очень общий совет. В случае LPCSTR используйте вместо него строку. В случае структур использовать структуру как параметр для вектора. Конечно, это требует, чтобы сама структура отслеживала свои собственные ресурсы, поэтому не храните в ней указатели, представляющие право собственности. –

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

  • Нет связанных вопросов^_^