问题:在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
版权声明:本文为博主原创文章,未经博主允许不得转载。