Я пытаюсь исправить потенциально эскизное использование кастования void*
в приложении планирования задач в течение нескольких недель. Обратите внимание, что я НЕ получаю ошибку компилятора, но программа планирования вылетает через несколько часов (по какой-то неизвестной причине). Рассмотрим следующие фрагменты кода из программы:Кастинг в пустоту * с потенциально эскизным поведением
В main
:
CString* buffer = new CString(temp);
parameters.set("jobID", (void *) buffer);
runJob(parameters);
Кроме того, VGridTaskParam
класс выглядит следующим образом:
class VGridTaskParam{
map<CString, void *> p; // maps from CString to a pointer that is not known
public:
void * get(CString name){
return p[name]; // returns the map value of the name which is an unknown pointer
}
void set(CString name, void * data){
p[name] = data; // sets the mpa value given a particular key
}
};
Snippet некоторой работы в runJob(VGridTaskParam parameters)
функции:
void runJob(VGridTaskParam parameters)
{
CString JIDstr; // job ID string
//get job ID as CString
CString* pJID = (CString*)parameters.get("jobID");
JIDstr = CString(*pJID);
delete pJID; ******************************
}
Некоторые вопросы: лань s последняя строка delete
(отмечена несколькими звездочками) удаляет выделение памяти, созданное в основной программе? Является ли мое использование void * casting оправданным в этой ситуации. Обратите внимание, что всякий раз, когда я запускаю задание, я создаю новый поток. Может ли кто-нибудь предложить потенциальное решение этой проблемы? На что я должен обратить внимание, чтобы исправить эту проблему?
Если он сработает через несколько часов и не сразу, у вас наверняка закончится память, поэтому ваша интуиция о 'delete' находится в точке. По общему признанию, здесь все в порядке, поэтому я думаю, что проблема находится где-то еще в 'runJob' или методе, который он вызывает. Возможно, выделено больше памяти или возможно, что ваш 'CString *' будет освобожден другим способом, что приведет к двойному удалению. – AndyG
Я не могу сказать, что такое точная ошибка, но могу сказать, что динамическое распределение объекта и требование его удаления вручную запрашивает утечку памяти. Мое предложение, по возможности, состояло бы в том, чтобы изменить тип данных с параметрами hold-values с (void *) на unique_ptr (или даже на простое старое хранимое значение Cstring), так что требуемые удаления (и удалять ваши явные вызовы для удаления, конечно). Вероятно, это поможет решить проблему. –
Я не вижу никакой причины использовать 'void *' cast здесь, однако, похоже, что они не способствуют сбою. Я бы предложил удалить void * арифметику из C++-программы, посмотреть, требуется ли вам какое-либо управление динамической памятью - возможно, удалите это. Это сделает код более понятным и понятным, так что ошибка может быть найдена легче (если она по-прежнему остается). – SergeyA