c++ - Char* 在尝试获取/设置时损坏

标签 c++ qt qtreewidget qtreewidgetitem

我曾经在我的应用程序中添加一个基于 treewidget 的功能。

当右键单击一个项目时,我可以在 FS over USB 上创建一个文件夹。

主要是说当在 TreeWidget 上选择一个项目时,我得到它的名称并检查它是否是一个文件夹,如果是,我创建一个子项并添加一个新文件夹并归档名称。

在 FS 上创建文件夹,我正在使用它:

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()));
    }

当左键单击操作并选择添加文件夹时,此代码连接到 CONNECT。

我这样做是为了避免在重命名时使用对话框。我正在做的是添加一个名为 New Folder 的项目,使其可编辑并允许用户更改它。当用户按下回车键时,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);

我的问题是父级不包含正确的名称。

我正在使用

在 onAddFolderAction 中备份它
setParentFolder(parent_folder_name); 

并使用

取回它
getParentFolder();

两者声明如下

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

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

使用getParent时,返回值不正确。但似乎该值较早损坏。

在 AddFolderACtion() 中,我有:

   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”,但在 setParentFolder 上逐步移动时,parent_folder_name 变为“XFZV”奇怪字符。

知道为什么吗?

最佳答案

在代码中

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

latin_str 变量在 else block 内,一旦 else block 结束,就会超出范围并被销毁。这给您留下了一个流浪指针,指向现在已破坏和未分配的内存,导致 undefined behavior当你取消引用它时。

我的建议是尽可能使用QString,并且只在实际需要时才转换为指针(即使您需要多次转换)。要么,要么更改其余代码以接受 QString(这将是 IMO 更好的解决方案)。

关于c++ - Char* 在尝试获取/设置时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27836613/

相关文章:

C++ 在类的 const 方法中将 char 数组分配给 T* 的方法

c++ - 有没有办法仅对斜杠的第一个实例应用 fnmatch 的 FNM_PATHNAME 标志?

qt - 设置Qlabel宽度

qt - Simple Qt code for network 简单网络连接

python - 如何阻止 QTreeWidget 移动滚动位置?

c++ - 切换到 glVertexPointer 后未应用 Cg 着色器

c++ - avx浮点按位逻辑运算的原因是什么?

c++ - Qt Action 不会连接到插槽

c++ - 如何将 QTableWidget 添加到 QTreeWidget 中,但作为 QTreeWidgetItem

c++ - 项目的 QTreeWidget