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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 06:02:41

Qt中如何用指针返回参数的相关文章

QT中使用函数指针

想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*commandFun)(void);一个QString ,一个指向MainWindow类成员函数的指针.但是没想到在类中使用函数指针这么复杂. 一般情况,我们使用函数指针声明和引用都很简单明了.但是在类中就不一样了.最后的成功的形式如下: class command_type { public: comm

Qt 中使用智能指针

教研室的项目,就是用Qt做个图形界面能收发数据就可以了,但是创建数据管理类的时候需要各种new, delete,很小心了但是内存使用量在不断开关程序之后函数会长,由于用的是gcc 4.7.*  所以好像没有shared_ptr可以用,上网查了一下原来QT也有智能指针. 常用的有 QScopedPointer 以及 QSharedPointer,用法与STD的 unique_ptr以及shared_ptr都十分的类似,像下面这样: 1 QScopedPointer<NcWriteThread>

Qt中QObject中的parent参数

今天写了一个小程序,验证了带参的构造函数中参数parent的作用. 在MainWindow中声明一个QDialog类型的指针,在MainWindow中对它进行初始化.我采用了两种初始化方式,一种是带参的构造函数,一种是不带参的构造函数.如下: /*mainwindow.h*/ ... QDialog *dialog; ... /*mainwindow.cpp*/ //第一种方式,用不带参的构造进行初始化 dialog = new QDialog; //第二种方式,用带参的构造函数初始化 dial

C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: CREATE PROCEDURE sp_AccountRole_Create @CategoryID int, @RoleName nvarchar(10), @Description nvarchar(50), @RoleID int output AS DECLARE @Count int -- 查

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

先看下面一个例子 #import <UIKit/UIKit.h> #import "AppDelegate.h" @interface Something : NSObject - (void)doWithError:(NSError **)outError; @end @implementation Something - (void)doWithError:(NSError **)outError { @autoreleasepool { *outError = [NS

C++中引用传递和指针传递函数参数的详解

先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值和地址,这时的内存长什么样子呢? 注意指针是一个变量,它当然有内存空间,里面存的就是一个地址,通过这个地址我们就能找到它所指向的对象. 说明:上图中两个字母p和n在最左边,代表什么?后面在介绍程序的编译过程中用到,先卖个官司.如果下面的写的东西你看不懂,没关系,往下看,我不相信你看完最后的编译原理的

qt中调用shell脚本并监控返回的方法

在QT中经常要调用外部命令或者是执行shell脚本,并且要对执行结果进行分析. QProcess runShellProcess =new QProcess(this); //调用过程输出的监控 connect(runShellProcess, SIGNAL(readyRead()), this, SLOT(readProcess())); connect(runShellProcess, SIGNAL(finished(int)), this, SLOT(finishedProcess()))

linux c 的main 函数中的return 和 查看返回参数 argv 与 argc 作用

hello.c #include <stdio.h> int main(int argv, char* argc[]) { printf("hello word!\n"); return 0; } 编译后  直接运行   && 作用为连接命令 gcc hello.c -o main.out && ./main.out 再运行  就查看返回参数 echo $? argv作用: main.c文件代码 #include <stdio.h>

Qt中的标准对话框

1.标准对话框 (1)Qt为开发者提供了一些可复用的对话框类型 (2)Qt提供的可复用对话框全部继承自QDialog类 @1:QMessageBox(用来提示消息的对话框) QFileDialog(文件对话框) QPrintDialog QColorDialog(用来选择一种颜色) QInputDialog QProgressDialog 这些对话框类型全部继承自QDialog类 (3)Qt中标准对话框遵循相同的使用方式 DialogType dlg(this); //先定义对话框对象,Dial