EXC_BAD_ACCESS проблема после рефакторинга

Следующий код работает в симуляторе Marmalade (я использую x-code для OSX)

bool PictureDictionary::OnTableSelect(CTable* table, int tab){
//if something is selected, look up the item, and display it
//also change the search to the selected item
if(-1 < tab){

// if a term is selected, set the search text field to the term
CString term = m_SearchResults.GetString(tab);

if(m_currentWord != (char*)term.Get()){
m_currentWord = (char *)term.Get();
m_searchTextField->SetAttribute("text", term);

char* normalizedTerm = (char *)term.Get();
char* imagePath;
sprintf(imagePath,"images/%s.jpg", normalizedTerm);

if(m_ImageAttached){
m_Image->SetAttribute("image", (const char*)imagePath);
} else {
m_Image = CreateImage(CAttributes()
.Set("name",    "picture")
.Set("x1",      "0")
.Set("x2", "0")
.Set("y1",      "50%")
.Set("image", (const char*)imagePath)
);
m_SearchView->AddChild(m_Image);
m_ImageAttached = true;
}
}
}
return true;
}

Когда я запускаю симулятор и выбираю элемент из таблицы, изображение появляется и изменяется, когда я выбираю другой элемент. Когда я иду на рефакторинг, я получаю ошибку EXC_BAD_ACCESS (code = 1… ..)

bool PictureDictionary::OnTableSelect(CTable* table, int tab){
//if something is selected, look up the item, and display it
//also change the search to the selected item
if(-1 < tab){

// if a term is selected, set the search text field to the term
CString term = m_SearchResults.GetString(tab);

if(m_currentWord != (char*)term.Get()){
m_currentWord = (char *)term.Get();
m_searchTextField->SetAttribute("text", term);

char* normalizedTerm = (char *)term.Get();
char* imagePath;
sprintf(imagePath,"images/%s.jpg", normalizedTerm);

UpdatePictureView(imagePath);
}
}
return true;
}

void PictureDictionary::UpdatePictureView(char* imagePath){
if(m_ImageAttached){
m_Image->SetAttribute("image", (const char*)imagePath);
} else {
m_Image = CreateImage(CAttributes()
.Set("name",    "picture")
.Set("x1",      "0")
.Set("x2", "0")
.Set("y1",      "50%")
.Set("image", (const char*)imagePath)
);
m_SearchView->AddChild(m_Image);
m_ImageAttached = true;
}
}

Любые предложения о том, как очистить код без этих проблем?

Редактировать RE Комментарии о неинициализированных переменных:
m_ImageAttached был инициализирован как false в конструкторе, если я не делаю что-то не так. Кроме того, изменение условия для проверки, если m_Image! = NULL, также вызывает ту же ошибку.

main.cpp:

PictureDictionary pictDict(myApp, &dictionary);

Конструктор для PictureDictionary:

PictureDictionary::PictureDictionary(CAppPtr app,Dictionary::Dictionary* dictionary){
m_App = app;
m_Dictionary = dictionary;
m_currentWord = "";
m_ImageAttached = false;
}

0

Решение

imagePath является унифицированным указателем в обоих фрагментах. Любая попытка разыменования является неопределенным поведением. Это просто появилось Работа в первом фрагменте. Использовать массив или заполнить std::string вместо:

std::string imagePath(std::string("images/") + normalizedTerm + ".jpg");

И использовать std::string::c_str() если доступ к базовому const char* необходимо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]