尝试获取/设置时 Char* 已损坏
Char* corrupted when trying to get it / set it
我曾经在我的应用程序中添加一个基于 treewidget 的功能。
当右键单击一个项目时,我可以在 FS over USB 上创建一个文件夹。
主要是说在 TreeWidget 上选择一个项目时,我得到它的名字并检查它是否是一个文件夹,如果是,我创建一个 child 并添加一个新文件夹并归档名称。
在 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);
我的问题是 parent 不包含正确的名称。
我正在使用
在 onAddFolderAction 中备份它
setParentFolder(parent_folder_name);
并使用
取回
getParentFolder();
两者声明如下
void TreeView::setParentFolder(char *name) {
this->ParentFolder = name;
}
char *TreeView::getParentFolder() {
return this->ParentFolder;
}
使用 getParent 时,值 return 不正确。但似乎该值较早损坏。
在 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 上移动 step-by-step 时,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
块内是局部的,一旦 else
块结束就会超出范围并被销毁。这给您留下了一个流浪指针,指向现在已破坏和未分配的内存,当您取消引用它时导致 undefined behavior。
我的建议是尽可能使用QString
,只有在真正需要的时候才转换为指针(即使你需要多次转换)。要么,要么更改其余代码以接受 QString
(这将是更好的解决方案 IMO)。
我曾经在我的应用程序中添加一个基于 treewidget 的功能。
当右键单击一个项目时,我可以在 FS over USB 上创建一个文件夹。
主要是说在 TreeWidget 上选择一个项目时,我得到它的名字并检查它是否是一个文件夹,如果是,我创建一个 child 并添加一个新文件夹并归档名称。
在 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);
我的问题是 parent 不包含正确的名称。
我正在使用
在 onAddFolderAction 中备份它setParentFolder(parent_folder_name);
并使用
取回getParentFolder();
两者声明如下
void TreeView::setParentFolder(char *name) {
this->ParentFolder = name;
}
char *TreeView::getParentFolder() {
return this->ParentFolder;
}
使用 getParent 时,值 return 不正确。但似乎该值较早损坏。
在 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 上移动 step-by-step 时,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
块内是局部的,一旦 else
块结束就会超出范围并被销毁。这给您留下了一个流浪指针,指向现在已破坏和未分配的内存,当您取消引用它时导致 undefined behavior。
我的建议是尽可能使用QString
,只有在真正需要的时候才转换为指针(即使你需要多次转换)。要么,要么更改其余代码以接受 QString
(这将是更好的解决方案 IMO)。