Qt中如何用指標返回引數
問題:在qt中寫一個方法,用指標做返回值,編譯沒有問題,但執行的時候程式會報錯。
我的操作步驟:
1.新建一個Test的測試類,內容如下:
Test.h
Test.cpp
2.main方法去呼叫Test類中void fun(QString* pStr)方法,如下,程式編譯執行一下,沒有問題
3.接下來,列印一下main方法中引數pStr1的內容,理論下*pStr1的值會是”123456”,然後並非如此,如下圖,編譯時沒有報錯,而執行的時候程式報錯了:
4.從步驟2到步驟3可以看出,程式碼是因為加了qDebug()<<*pStr1;後才報錯的,那麼問題就是在這裡了,然後再看這個語句,心想,應該是*pStr1指向的記憶體被釋放了,所以用*pStr1的時候就會導致程式崩潰,於是,做了如下驗證(空間原因,下面直接寫程式碼的形式呈現給大家):
#include "Test.h"
#include <QtCore>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString *pStr1=NULL;
Test t ;
t.fun(pStr1);
if(pStr1 == NULL)
{
qDebug()<<"指標pStr1為NULL";
}
else
{
qDebug()<<"*pStr1 ="<<*pStr1;
}
return 0;
}
編譯執行後控制檯顯示:
指標pStr1為NULL
5.看來是pStr1指向的內容被釋放了,但跟自己之前學了C++ new出來的東西要對應有delete,不然會一直存在於堆中,只有到程式完全結束才會被釋放這塊記憶體的理論不一致呀。於是看了如下一篇文章http://blog.csdn.net/dbzhang800/article/details/6300025,關於qt的delete問題,看完後,只明白Qt本身帶有一個記憶體管理機制,但是現在如何修改程式碼,讓程式實現用指標傳參呢?
解決方法:
程式碼改寫了fun函式的語句,不過我還是把整體的程式碼貼出來,大家好看清楚整體是怎麼樣的
Test.h
#ifndef TEST_H
#define TEST_H
#include <QtCore>
class Test
{
public:
Test();
public:
void fun(QString* pStr);
};
#endif // TEST_H
Test.cpp
#include "Test.h"
Test::Test()
{
}
void Test::fun(QString *pStr)
{
QString s = "123456";
*pStr = s;
}
main函式部分
#include "Test.h"
#include <QtCore>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString *pStr1 = new QString;
Test t ;
t.fun(pStr1);
if(pStr1 == NULL)
{
qDebug()<<"指標pStr1為NULL";
}
else
{
qDebug()<<"*pStr1="<<*pStr1;
}
return 0;
}
程式編譯後執行為:
大家好,我是綠色流氓兔,我希望我能把我遇到的一些問題,用圖文並茂的方式寫出來,分享給大家。歡迎和大家互相交流討論,我是綠色流氓兔:QQ929955289