函数返回字符串变量的有关问题

函数返回字符串变量的问题
void *FieldServer::sqlQueryFunction(const unsigned short &majorCmd,const unsigned short &minorCmd,const void* inputStr)const
{
void *pTemp;
QSqlQuery m_Query;
QString strSql=QString((char*)(inputStr));
m_Query.exec(strSql);

if (m_Query.next())
{
//std::string str = m_Query.value(0).toString().toStdString();
//const char* ch = str.c_str();
//pTemp = (void *)ch;// &m_Query.value(0).toString();
/*char* ch;
QString str = m_Query.value(0).toString();
QByteArray ba = str.toLatin1();
ch=ba.data();
pTemp =(void *) ch;*/
QString str = m_Query.value(0).toString();
QByteArray ba = str.toLatin1();
pTemp = "123";//(void *)ba.data();
}
return pTemp;
}


大致是这么一段代码,从数据库里查询一个数据然后返回,返回值是void*,如果返回常量当然OK,返回变量就会出现临时变量被销毁,地址内容为乱码的情况,请问该如何解决呢?谢了

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

可以用malloc来申请堆空间,使用后记得释放

这样做不太好吧,一般是个人都会忘记的,即使仅仅是自己用。
在一个函数里free就好了,超过这个函数的生命周期,就很难保证了。除非有什么约定,强调必须free。没必要增加内存泄漏的风险。
void FieldServer::sqlQueryFunction(const unsigned short &majorCmd,const unsigned short &minorCmd,const void* inputStr,void *returnStr)const
{
void *pTemp;
QSqlQuery m_Query;
QString strSql=QString((char*)(inputStr));
m_Query.exec(strSql);

if (m_Query.next())
{
QString str = m_Query.value(0).toString();
QByteArray ba = str.toLatin1();
returnStr = (void *)ba.data();
}
}

现在改成这样,还是乱码

你这样是不行,返回的函数局部变量的地址的!

void FieldServer::sqlQueryFunction(const unsigned short &majorCmd,const unsigned short &minorCmd,const void* inputStr,void *returnStr)const
{
    void *pTemp;
    QSqlQuery m_Query;
    QString strSql=QString((char*)(inputStr));
    m_Query.exec(strSql);
     
    if (m_Query.next())
    {
        QString str = m_Query.value(0).toString();
        QByteArray ba = str.toLatin1();
       //这里是还是把它的地址赋值给returStr,而不是内容!所以也会出现乱码!
       // returnStr = (void *)ba.data();
        //用这个拷贝内容下!
       memcpy(returnStr, (void*)ba,data(), /*拷贝数据的长度*/);
    }
}
那么returnStr必须之前就开好内存了是吧?又有一个问题请教一下,我其实并不确定返回的内容具体有多大,那么returnStr该如何分配内存?

1 动态分配内存吧!传双指针(指针本身的地址)进来,通过动态获取数据长度后,
  再分配内存大小,然后再拷贝数据!
2 提前定义一块很大的内存空间!直接传地址进来拷贝数据
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

对方的要求就是我能得到一个存放数据的指针,类型为void*,我没法修改这一块,就只能做数据库读取的部分内容,就这样,分配的任务是这样我也没法去改不是……

这个就不知道了,传回指针的时候,必须保证这个指针是有效的,你取到的数据100%是局部的,那就只能malloc一块内存,然后把数据拷贝到这个指针上返回。但这样就要引起内存管理的问题,这个要协商好,必须及时释放资源。或者可以要求对方提前开辟一块足够大的空间给你,malloc既然在他哪里,free也在他那里,就没你的事了。
现在就按照前面的作法,把指针的地址传进去,再在调用了之后free掉,这样产生的新的问题就是,我在sqlQueryFunction里面去malloc的空间,在调用sqlQueryFunction的函数里面free,会不会造成泄漏?

应该不会,及时free掉就没问题了。还有哪里调用的就在哪里free掉咯,如果再延长到其他函数里,就说不清了,只会使管理更加混乱。