2015-01-08 14 views
0

treewidget을 기반으로하는 앱에 기능을 추가하는 데 사용됩니다.Char * 값을 가져 오려고 할 때 손상됨/설정

항목을 마우스 오른쪽 버튼으로 클릭하면 USB를 통해 FS에서 폴더를 만들 수 있습니다.

주로 TreeWidget에서 항목을 선택할 때 그 이름을 가져 와서 폴더인지 확인합니다. 그렇다면 자식을 만들고 새 폴더를 추가하고 파일을 저장합니다.

, 나는이를 사용하고있어 FS에서 수행 폴더를 생성합니다 클릭 동작을 떠날 때이 코드가 CONNECT에 연결되어

void TreeView::onAddFolderAction() { 
    char *parent_folder_name; 
    QList<QTreeWidgetItem *> item; 
    bool isFolder; 

    item = this->selectedItems(); 
    if (item.empty()) 
     parent_folder_name = NULL; 
    else { 
     QString str = item[0]->text(0); 
     QByteArray latin_str = str.toLatin1(); 
     parent_folder_name = latin_str.data(); 
    } 
    setParentFolder(parent_folder_name); 

    if(!item.empty()) 
     isFolder = m_device.isParentFolder(parent_folder_name); 
     if(isFolder == false) 
      return; 

    QTreeWidgetItem* child = new QTreeWidgetItem(); 
    child->setText(0, "New Folder"); 
    child->setText(1, "--"); 
    child->setText(2, "--"); 
    child->setFlags(child->flags() | Qt::ItemIsEditable); 
    if(!item.empty()) { 
     item[0]->addChild(child); 
     item[0]->setExpanded(true); 
    } 
    else 
     addTopLevelItem(child); 

    this->editItem(child); 
    this->setCurrentItem(child); 
    connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(onTreeItemChanged())); 
    } 

및 폴더를 선택 추가합니다.

이름을 바꿀 때 대화 상자를 사용하지 않기 위해이 작업을 수행했습니다. 새 폴더라는 항목을 추가 할 때 편집중인 항목을 추가하고 사용자가 변경할 수 있도록합니다. 사용자가 enter 키를 누르면 itemChanged 신호가 트리거되고 onTreeItemChanged가 시작됩니다.

QList<QTreeWidgetItem *> items; 
bool isFolderCreated; 
items = this->selectedItems(); 
QString str = items[0]->text(0); 
QByteArray latin_str = str.toLatin1(); 
char *newFolder = latin_str.data(); 
char *parent = getParentFolder(); 

isFolderCreated = m_device.CreateFolder(newFolder, parent); 

저의 문제는 부모에게 엄밀함 이름이 포함되어 있지 않습니다.

내가

setParentFolder(parent_folder_name); 

을 사용하고의 getParent를 사용하는 경우

void TreeView::setParentFolder(char *name) { 
    this->ParentFolder = name; 
} 

char *TreeView::getParentFolder() { 
    return this->ParentFolder; 
} 

아래로

getParentFolder(); 

이 선언되고 사용하여 다시 얻을 onAddFolderAction에서을을 backuping있어의 값 반환이 올바르지 않습니다. 그러나 가치가 더 일찍 손상된 것으로 보인다. 단계별 setParentFolder, "XFZV"이상한 caracters에 PARENT_FOLDER_NAME 변화에 이동할 때

else { 
     QString str = item[0]->text(0); 
     QByteArray latin_str = str.toLatin1(); 
     parent_folder_name = latin_str.data(); 
    } 
    setParentFolder(parent_folder_name); 

PARENT_FOLDER_NAME는 "BLABLA"를 포함하지만 : AddFolderACtion에의

는(), 내가했다.

왜 그런가? 코드

else { 
    QString str = item[0]->text(0); 
    QByteArray latin_str = str.toLatin1(); 
    parent_folder_name = latin_str.data(); 
} 
setParentFolder(parent_folder_name); 

변수 latin_str에서

+0

디버거를 사용해 보셨습니까? – user657267

+0

1 단계, [문서] (http://qt-project.org/doc/qt-4.8/qbytearray.html#data)를 읽으십시오 : "포인터는 바이트 배열이 재 할당되거나 소멸되지 않는 한 유효합니다 . " – molbdnilo

답변

5

else 블록 내부의 지역이며, 범위를 벗어나 이동되고 else 블록 끝 일단 파괴 얻을. 이로 인해 포인터가 사라져서 현재 소멸되고 할당되지 않은 메모리를 가리키며 역 참조 할 때 undefined behavior이됩니다.

제 생각에는 QString을 가능한 한 많이 사용하고 실제로 필요할 때만 포인터로 변환하십시오 (여러 번해야하는 경우에도). 어느 쪽이든, 또는 나머지 코드를 QString (더 나은 해결책 인 IMO)을 허용하도록 변경하십시오.