Я работаю над устаревшим приложением C ++, которое имеет следующую функцию:
char* CreateNewString (const char* node)
{
int len = (int) strlen(node) + 1;
char * ptr = new char [len];
strcpy_s(ptr, len, node);
return ptr;
}
Эта функция вызывается из многих классов в приложении, и вот пример использования.
char * nodeID = obj.CreateNewString(process->GetNodeID());
Приложение вызывает другой процесс и получает идентификатор узла в виде указателя на символ, а затем передает его в функцию CreateNewString для динамического выделения памяти для новой строки.
Нигде в приложении послеВызов выше, это удаление памяти.Из того, что я наблюдаю, здесь есть определенная утечка памяти.
Я думаю, что есть несколько способов решить эту проблему.Но я хочу изучить использование интеллектуальных указателей в C ++ 11, прежде чем пытаться что-либо еще.
То, что я пытался:
Итак, я придумал следующую функцию:
char* CreateNewString (const char* node)
{
int len = (int) strlen(node) + 1;
shared_ptr<char> ptr (new char [len](), [](char* p) {delete [] p;});
strcpy_s(ptr.get(), len, node);
return ptr.get();
}
Цель - сохранить сигнатуру функции неизменной, то есть она возвращает указатель на символ, чтобы мне не приходилось вносить изменения во всех вызывающих местах.
Выше приведеноне работает, поскольку ptr выпущено, поскольку оно объявлено внутри области действия этой функции.
Моя цель:
- Использовать умные указатели C ++ 11 для достижения этой цели.с минимальными изменениями кода в существующем приложении.
Другой известный мне способ - это динамическая инициализация массива в самих вызывающих местах, а затем удаление его до конца этой области.Но я хочу изучить новые возможности C ++, прежде чем вернуться к традиционному способу C ++.Кстати, я не заинтересован в изучении std::string
на данный момент.