2011-10-03 54 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;
相關問題