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

时间:2011-10-03 19:18:53

标签: c++ qt segmentation-fault

我对Qt和c ++很陌生,但根本不是编程新手。我在程序中使用指针时遇到问题。在我的头文件中,我有以下私有变量指针赋值:

private:
    QString *currentFile;

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

QString fileName = *currentFile;

但是这会在调试时立即给我分段错误。我完全不知道我做错了什么。

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

*currentFile = QString::null;

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

希望有人可以提供帮助。

由于

修改

更多代码

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

5 个答案:

答案 0 :(得分:2)

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

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

currentFile = new QString;

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

delete currentFile;

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

使用QObject派生类型(小部件等),它是一个不同的故事,你应该使用它们的指针(如果使用得当,Qt会为你处理释放)。但是QString(通常是字符串)是一种类似于值的类型(类似于内置类型),并且在大多数情况下不必动态分配。

答案 1 :(得分:2)

在这两种情况下:

QString fileName = *currentFile;
*currentFile = QString::null;

取消引用一个单位指针。

第二个赋值不会将指针初始化为NULL;它的作用是:首先取消引用currentFile指针并销毁它指向的对象,并用QString :: null对象替换它。

QString :: null是Qt用来表示未初始化字符串的特殊结构,但不要将它与NULL指针混淆。

您应该像这样初始化指针:

currentFile = new QString();

答案 2 :(得分:2)

在您提供的代码中根本没有理由使用指针。因此,请尝试此操作(从您提供编辑之前的代码开始)

private:
    QString currentFile;
QString fileName = currentFile;
currentFile = QString::null;

答案 3 :(得分:1)

如果currentFile为null,那么当然取消引用它会崩溃。将它设置为QString :: null不会给你一个空字符串。它给你一个空指针。你想要的是这样的:currentFile =“”;

Cat Plus也有一个好处。您首先不需要指针(对于您向我们展示的内容)。

答案 4 :(得分:0)

将此currentFile = new QString();放在构造函数

修改

并将delete currentFile;放入析构函数