尝试在Qt中接收指针值时出现分段错误 我对QT和C++很陌生,但对编程来说并不陌生。我在程序中使用指针时遇到问题。在头文件中,我得到了以下私有变量指针赋值: private: QString *currentFile;

尝试在Qt中接收指针值时出现分段错误 我对QT和C++很陌生,但对编程来说并不陌生。我在程序中使用指针时遇到问题。在头文件中,我得到了以下私有变量指针赋值: private: QString *currentFile;,c++,qt,segmentation-fault,C++,Qt,Segmentation Fault,在我的程序中,我有一个函数,它通过将currentFile指针的值复制到另一个QString变量开始: QString fileName = *currentFile; 然而,在调试时,这立即给了我分段错误。我完全不知道我做错了什么 在我调用试图获取指针vlue的函数之前,程序运行得很好。我想这可能是因为指针是空的,所以我尝试将以下代码添加到构造函数中: *currentFile = QString::null; 将null值分配给指针值,然而,这只是在调用构造函数时给了我分段错误 希望有人

在我的程序中,我有一个函数,它通过将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();
}
void记事本::save(){
QString文件名=*当前文件;
如果(文件名!=“”)
{
QFile文件(文件名);
如果(!file.open(QIODevice::WriteOnly))
{
QMessageBox::critical(this,tr(“错误”),tr(“无法写入文件”);
返回;
}
其他的
{
QTextStream流(&文件);
QString editorContent=textEdit->toPlainText();
currentContents=&editorContent;

stream如果currentFile为null,那么取消引用它当然会崩溃。将其设置为QString::null不会给您一个空字符串。它会给您一个null指针。您需要的是如下内容:currentFile=“”


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

将其放入构造函数:

currentFile = new QString();
currentFile = new QString;
不要忘记删除它(例如在析构函数中):


这很可能是因为您从未为字符串分配过任何存储空间。指针只存储一个内存地址,如果其值初始化为0(或者更糟的是,为零,并且包含一个完全未定义的地址),则它不会指向有效的字符串对象,并且尝试将它指向的内存用作字符串对象会导致未定义的行为(在您的示例中为segfault)

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

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

但是正如在评论中所说,我真的怀疑你是否需要一个指针成员。为什么不直接使用
QString
对象作为成员呢?或者如果你真的需要指针,那就使用一些智能指针(比如
auto\u ptr
或者新的C++11
unique\u ptr
或者
shared\u ptr

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

在这两种情况下:

QString fileName = *currentFile;
*currentFile = QString::null;
您取消了对单位化指针的引用

第二个赋值并不初始化指向NULL的指针;它所做的是:首先取消引用currentFile指针并销毁它指向的对象,然后用QString::NULL对象替换它

空是一种特殊的结构,Qt使用它来指示未初始化的字符串,但不要将其与空指针混淆

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

currentFile = new QString();

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


更多代码。另外,不要使用指针,您不需要它。构造函数中的
*currentFile=QString::null
会取消对未初始化指针的引用。如果有任何问题,则应该是
currentFile=QString::null
@eran:他语法正确。QString::null是未初始化的字符串,而不是空指针(请参阅)。但是,你说他试图取消对未初始化指针的引用是正确的,这导致了他的seg故障。你能简要解释一下在哪里使用指针是明智的吗?@Simon:其中值和引用不足以解决问题。默认情况下不使用指针。别忘了
删除当前文件
l等等!大多数Qt数据类型,包括QString,都实现了隐式共享,这使得它即使用作值也非常有效。此外,Qt有自己的一组智能指针,随着C++11的广泛实现,这在未来几年中肯定不会很重要(但现在它们是一个合理的选择,因为您可以避免在程序中添加另一个依赖项,比如Boost提供智能指针)。
QString fileName = *currentFile;
*currentFile = QString::null;
currentFile = new QString();
private:
    QString currentFile;
QString fileName = currentFile;
currentFile = QString::null;