2010-10-10 1 views
1

У меня есть частный атрибут в классе, который определяется как vector<pair<char *, int> > data;. Я добавляю данные к этому вектору с data.push_back(make_pair(p, r));. Позже, когда я иду, чтобы получить данные из вектора, я получаю плохие данные для значения p. Возвращенные данные выглядят как ��U3. Я думаю, это связано с тем, что хранится указатель на массив символов. Как я могу хранить фактическую копию в векторе. Если это помогает, массив символов никогда не будет превышать 255 символов + 1 для нулевого завершения.C++ Сохранение копии строки в векторе пар

+1

Вы можете показать нам, как вы выделяете строку, которую вы добавляете в свою пару векторов? – 2010-10-10 07:26:25

ответ

1

Похоже, что у вас есть указатель на p (который определен в то время), помещенный в стек. Как только стек стека выскочит, у вас все еще есть указатель, но память, на которую он указывает, может быть мусором. Такие проблемы с обвисшими указателями могут вызвать раздражение, поэтому я рекомендую использовать класс std :: string, который определен в #include <string> для хранения строковых данных.

+0

Не обязательно имеет отношение к стеку. – Potatoswatter

+0

@Potatoswatter: Правда, без кода я не могу сказать с какой-либо определенностью, но это было просто предположение о том, что я думал, что это возможно. – shuttle87

5

Любые реальные причины использования char*?

Используйте std::string, что затруднит ваши проблемы.

1

Поскольку STL основан на семантике копирования и значения, проще, если вся целая строка символов, а не только указатель на нее, хранится в контейнере (здесь vector). Я сказал «проще», потому что можно сохранить указатели в контейнерах STL, но тогда указанная память должна управляться кодом пользователя. Из этого вопроса кажется, что это не сделано.

Таким образом, возможно, вы можете использовать string вместо char *, например, для:

typedef std::pair< std::string, int > MyPair; 
std::vector<MyPair> data; 
1

Если у вас есть vector<pair<char *, int> > вы имеете дело с голыми указателями и нужно вручную управлять срок службы ваших строк. Это большой PITA и очень вероятно, что вы делаете что-то неправильно (тем более, что вы даже не потрудились заявить, что хотите сделать это правильно, что, кажется, предполагает, что вы даже не знаете, что вам нужно сделай это).

Как и другие, я бы предложил вместо этого использовать vector<pair<std::string, int> >.

1

Вы назначаете строку через переменную стека и сохраняете ее адрес? Это вызовет описанную вами проблему, когда вы вернетесь из функции, которую вы назначили.

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

char* pNext = new char[50]; 
strcpy(pNext, ...); 
data.push_back(make_pair(pNext, r)); 

Вы должны выполнить всю свою работу с массивами char -e.g. Вы должны убедиться, что они имеют нулевое завершение, или вы получите неожиданные результаты при их печати.

например.

pNext[49] = '\0'; 

Кроме того, помните, что когда вы закончили с выделенной строкой кучи, вы также должны удалить их. символ * 's удаляются следующим образом:

delete [] pNext; 

Как уже сказал, есть и другие варианты реализации строк, которые вызывают у вас меньше головной боли.

Проще всего использовать, вероятно, CString, но несет накладные расходы, включая реализацию MFC или реализацию ATL. std :: string, как упоминают другие, являются альтернативой.

надеюсь, что это поможет!