gpt4 book ai didi

c++ - 尝试在 Qt 中接收指针值时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 15:26:24 26 4
gpt4 key购买 nike

我对 Qt 和 C++ 很陌生,但对编程一点也不陌生。我在程序中使用指针时遇到问题。在我的头文件中,我得到了以下私有(private)变量指针赋值:

private:
QString *currentFile;

在我的程序中,我有一个函数,它首先将 currentFile 指针的值复制到另一个 QString 变量:

QString fileName = *currentFile;

然而,这会在调试时立即出现段错误。我完全不知道我做错了什么。

程序运行良好,直到我调用试图获取指针 vlue 的函数。我想这可能是因为指针是空的,所以我尝试将以下代码添加到我的构造函数中:

*currentFile = QString::null;

要为指针值分配一个 null 值,但是一旦调用构造函数,这只会给我带来段错误。

希望有人能帮忙。

谢谢

编辑

更多代码:

记事本.h:

class Notepad : public QMainWindow
{
Q_OBJECT

public:
Notepad();

private slots:
void open();
void save();
void saveAs();
void quit();

private:
QTextEdit *textEdit;
QString *currentFile;
QString *currentContents;
};

在 notepad.cpp 中创建错误的函数 (void save()):

void Notepad::save(){
QString fileName = *currentFile;
if(fileName != "")
{
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::critical(this, tr("Error"), tr("Could not write to file"));
return;
}
else
{
QTextStream stream(&file);
QString editorContent = textEdit->toPlainText();
currentContents = &editorContent;
stream << editorContent;
stream.flush();
file.close();
}
}
else
saveAs();
}

最佳答案

这很可能是因为您从未为字符串分配任何存储空间。指针只存储一个内存地址,如果它的值被初始化为 0(或者更糟的是什么都没有并且包含一个完全未定义的地址),那么它不会指向一个有效的字符串对象并尝试使用它指向的内存作为字符串对象导致未定义的行为(在您的情况下为段错误)。

因此您首先需要为字符串分配内存并使用(可能在周围对象的构造函数中)构造字符串:

currentFile = new QString;

及以后(不再需要时,例如在周围对象的析构函数中):

delete currentFile;

但是正如评论中所说,我真的怀疑你是否需要一个指针成员。为什么不直接使用 QString 对象作为成员。或者,如果您确实需要指针,则使用一些智能指针(如 auto_ptr 或新的 C++11 unique_ptrshared_ptr)。

对于 QObject 派生类型(小部件等),这是另一回事,您宁愿为它们使用指针(如果使用得当,Qt 会为您处理释放)。但是 QString 是(通常像字符串一样)更像值的类型(类似于内置类型)并且在大多数情况下不必动态分配。

关于c++ - 尝试在 Qt 中接收指针值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7639598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com