2011-10-03 81 views
0

我对Qt和C++很陌生,但对编程根本不陌生。我在我的程序中使用指针时遇到问题。在我的头文件我有以下私有变量的指针赋值:尝试在Qt中接收指针值时出现分段错误

private: 
    QString *currentFile; 

在我的节目,我已经得到了由currentFile指针的值复制到另一个QString的可变启动功能:

QString fileName = *currentFile; 

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

该程序运行得很好,直到我调用函数试图获得指针的线索。我想这可能是监守指针是空的,所以我尝试添加以下代码到我的建筑工:

*currentFile = QString::null; 

要将null值赋给指针值,然而,这只是尽快给我的分段错误的constructer被调用。

希望有人能帮忙。

由于

EDIT

更多的代码

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

函数产生错误(无效保存())在记事本中。 cpp:

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

更多的代码。另外,不要使用指针,你不需要它。 –

+0

在构造函数中增加了更多代码.. – Simon

+0

'* currentFile = QString :: null'将一个未初始化的指针解引用。如果有的话,这应该是'currentFile = QString :: null'。 – eran

回答

2

这是最有可能由于这样的事实,你永远不会分配给字符串的任何存储。指针只是存储一个内存地址,如果它的值初始化为0(或者甚至更糟到没有,并且包含完全未定义的地址),那么它不会指向有效的字符串对象,并尝试使用它指向的内存一个字符串对象导致未定义的行为(在你的情况下是段错误)。

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

currentFile = new QString; 

及更高版本(如果不是在周围对象的析构函数不再需要,如) :

delete currentFile; 

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

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

+2

大多数Qt数据类型,包括QString都实现了隐式共享,即使用作值时,它也非常有效。此外,Qt拥有自己的一套智能指针,在未来几年,C++ 11将会被广泛实现(但现在它们是一个合理的选择,因为您可以避免添加另一个依赖关系你的程序像Boost一样提供智能指针)。 –

1

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

Cat Plus也有一个好点。首先你不需要指针(因为你已经向我们展示过)。

+0

你可能会简单地解释一下使用指针会很聪明吗? – Simon

+0

@Simon:价值和参考资料不足以解决问题。默认为不使用指针。 –

0

将这个currentFile = new QString();在构造

编辑:

,并把delete currentFile;在析构函数

+0

现在工作 - 现在感觉真的很愚蠢。感谢堆! – Simon

+2

相反不完整的答案。不要忘记析构函数中的'delete currentFile',或者完全不使用字符串的指针。 –

+0

我 - 要等待两分钟,虽然;-) – Simon

2

在两种情况下:

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

取消引用一个未初始化的指针。

第二届分配不初始化指针NULL;它所做的是:首先取消引用currentFile指针并销毁它指向的对象,并用QString :: null对象替换它。

空字符串,是使用Qt来表示未初始化字符串特殊的结构,但不与NULL指针混淆。

你应该初始化指针这样的:

currentFile = new QString(); 
+0

稍后别忘了'delete currentFile'! –

2

没有理由在你提供的代码使用指针的。所以,试试这个,而不是(从你的代码提供您的编辑前)

private: 
    QString currentFile;
QString fileName = currentFile;
currentFile = QString::null;
相关问题