OpenCV函数返回的简单问题

下面是一个OpenCV的小程序:

 #include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

template<typename _Tp>
vector<_Tp> convertMat2Vector(const Mat &_t1f)
{
    //_t1f.convertTo(t1f, CV_64F);
    return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行
}


template<typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows)
{
    cv::Mat mat = cv::Mat(v);//将vector变成一列的mat
    cv::Mat dest=mat.reshape(cn, rows);
    cout << "dest=\n" << dest << endl;
    return dest;
}


int main()

{
    int arr[4][3] = { { 1, 1,1 },{ 2, 2,2 },{ 3, 3,3 },{ 4,4, 4 } };
    cv::Mat srcData(4, 3, CV_8UC1, arr);
    cout << "srcData=\n"<< srcData<< endl;
    vector<uchar> v = convertMat2Vector<uchar>(srcData);
    cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀?
    cout << "dest=\n" << dest << endl;



    system("pause");
    waitKey();
    return 0;
}

运行结果:
图片说明

问题是:各位大神啊,我这哪里出问题?为什么函数里的dest和还回的dest的结果值为什么不一样的呀?

4个回答

因为第2个方法的mat对象会释放,而dest引用的数据是来自于mat,并没有拷贝数据,因此在mat没有释放的情况下是正常的,
之后引用的内存就被释放而成为野数据。另外你srcData也不对。修改如下:

 #include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

template<typename _Tp>
vector<_Tp> convertMat2Vector(const Mat &_t1f)
{
    //_t1f.convertTo(t1f, CV_64F);
    return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行
}


template<typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows)
{
    cv::Mat mat = cv::Mat(v);//将vector变成一列的mat
    cv::Mat dest=mat.reshape(cn, rows).clone();
    cout << "dest=\n" << dest << endl;
    return dest;
}


int main()

{
    char arr[4][3] = { {1, 1, 1 },{ 2, 2, 2 },{ 3, 3, 3 },{ 4, 4, 4 } };
    cv::Mat srcData(4, 3, CV_8UC1, arr);
    cout << "srcData=\n"<< srcData<< endl;
    vector<uchar> v = convertMat2Vector<uchar>(srcData);
    cout << v.size() << endl;
    cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀?
    cout << "dest=\n" << dest << endl;

    system("pause");
    waitKey();
    return 0;
}

return dest1;
cv::Mat dest2 =convertVector2Mat
这句话的执行顺序是:
1、默认构造DEST2
2、以DEST1为源,赋值(operater=) 给DEST2
3、析构DEST1
不过大部份编译器为将其优化为:
1、以DEST1为源,拷贝构造给DEST2
2、析构DEST1

所以原因应该是CV:MAT未定义合适的拷贝构造函数所致。

如是这个原因,还会发生更有趣的事情:
在convertVector2Mat函数内部增加如下代码:
cv::Mat dest=mat.reshape(cn, rows);
cout << "dest=\n" << dest << endl;
cv::Mat dest2=dest
cout << "dest2=\n" << dest2 << endl;
这两个结果都应该不一样了。

解决办法有两个:
1、定义合适的拷贝构造函数与赋值函数。
2、改变实现形式,不再靠return赋值,而将结果能过 指针或引用 的参数返回。

我试了几次,如果convertVector2Mat里面是这样设置dest,可以返回:
Mat dest = (Mat_(4, 3) << 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4);
但如果这样设置,就返回不了:
int arr[4][3] = { { 1, 1, 1 }, { 2, 2, 2 }, { 3, 3, 3 }, { 4, 4, 4 } };
cv::Mat dest(4, 3, CV_8UC1, arr);
跟mat.reshape(cn, rows);是一个效果
我觉得应该跟动态分配有关系,这个是在接口内做的,建议你涉及动态分配的这些函数还是别用返回值来做。

输出如下:

srcData=
[  1,   1,   1;
   2,   2,   2;
   3,   3,   3;
   4,   4,   4]
12
dest=
[  1,   1,   1;
   2,   2,   2;
   3,   3,   3;
   4,   4,   4]
dest=
[  1,   1,   1;
   2,   2,   2;
   3,   3,   3;
   4,   4,   4]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【求助】简单的函数返回类型问题
各位好,语法还不是特别过关,可能问题简单,想大家请教了。rn程序实现的功能很简单rn public struct genestr //申明一个结构rn rn public string GeneID;rn public string Summary;rn public string[] GeneRif;rnrn rnrnrn class Programrn rn List inigenestr(string str) //申明一个方法rn rn string[] gene=File.ReadAllLines(str);rn genestr gtr = new genestr();rn List res= new List();rnrnrn genestr GenerateStr(int starIndex, int finishIndex)// 嵌套申明一个赋值方法,程序调试时应该是在这出了问题,不能定义返回类型为genestrrn rn gtr.GeneID = gene[starIndex];rn gtr.Summary = gene[starIndex + 1];rn int k = 0;rn for (int i = starIndex + 2; i <= finishIndex - 1; ++i)rn rnrn gtr.GeneRif[k] = gene[i];rn ++k;rn rn return gtr;rn rnrnrn int lastIndex = 0;rn int curIndex = 0;rn for (int i = 1; i <= (gene.Count() - 1); ++i)rn rn if (gene[i]=="")rn rn curIndex = i;rn res.Add( generateStr(lastIndex,curIndex));rn lastIndex = curIndex + 1;rn rn elsern rn Console.WriteLine("error");rn rn rn return res;rn rnrn找了半天没找明白,应该是确定在方法申明哪里出了问题,但是不知道怎么修改。rn谢谢大家、
一个简单问题:函数返回指针
有两个函数: rnint *f1() rn rn int a=34,*p; rn p=&a; rn return p; rn rn rnchar *f2() rn rn char a[]="abcdef",*p; rn p=a; rn return p; rn rn rn理论上说,两个都返回指向局部变量的指针,函数运行结束后内存回收,都应变为“野指针”,但f1()却能正常运行,结果正确,f2()结果不对,不知是怎么原因,请高手帮帮忙!
【求助】opencv的cvCaptureFromFile函数返回NULL
环境:rn非图形化界面的linuxrnopencv 2.4.3rnrn现象:rn在windows下使用opencv库实现了一个转化图片的工具,在迁移代码到linux版本上时出现了问题。在图形化界面的linux上,程序可以正常编译,运行;而在非图形化界面的linux上,程序可以正常编译,但是运行会报错,在获取视频基本信息的时候退出。rnrn目前程序是在调用opencv的cvCaptureFromFile函数返回NULL。rnrn请求各位大大,有谁遇到过类似的情况?或是知道如何解决纯后台版本linux上调用opencv加载视频失败的问题?
求助OpenCV 简单问题
我现在通过 DriectShow 利用摄像头捕捉到了一副图像 (包括图像头、数据区域),现在想通过OpenCV进行处理(由于精度要求,不使用cvCaptureFromCAM() 捕捉),具体模型如下:rnrnIplImage* ImageToIpImage(BITMAPINFOHEADER* pHandle, const BYTE *pImgData)rnrn分数不够可以再加 在线等 谢谢
函数返回问题
有一个函数,该函数必须返回数组的内容,该怎么实现?
函数返回的问题..
今天做数据结构作业。。。遇到点问题..rn//这个是主函数里调用的语句.. rnPrintStudentList(Order(ShellSort(Copy(A,n), n), n), n); rnrn被调用函数大致如下: rnStudentList Copy(StudentList A, int n) rn rn StudentList B = (StudentList)malloc(n*sizeof(student)); rn .....//A复制到B rn return B; rn rnStudentList ShellSort(StudenList A, int n); rnStudentList Order(StudentList A, int n); rn.... rnrn我想问的是Copy中的B在return 后,它的生存期不就结束了么?为什么我那样写程序还能运行? rnrn..是不是那个copy函数的最后没有用free把malloc分配的空间给释放掉,就算是内存泄漏了..就算函数返回了,堆里的空间还是占用着是吧?所以外层函数ShellSort()Order()之类的还可以访问那个空间里的内容?rn
函数返回的问题
main()rn int a=10,b=20;rn printf("a=%d,b=%d\n",a,b);rn swap(a,b);rn printf("a=%d,b=%d\n",a,b);rnrnswap(x,y)rnint x,y;rn int temp;rn temp=x;rn x=y;rn y=temp;rnrn rnrn为什么a,b没有能返回?谢谢大家
函数返回问题?
'--检查是否注册过用户名----------------------------------rn rn if F_CheckName(getUserName)=false thenrn response.Write(" ")rn response.Write("用户名已被使用,请返回重新填写!")rn response.Write("[返回]") response.End()rn end ifrnrn问题是:我用response.Write(F_CheckName(getUserName))明明是true了,可还是运行了if里面的代码。好迷惑啊rnfunction F_CheckName(strName)rn dim sqlrn dim rsrn Conn.open StrConnrn sql="select CUST_id from CUST where CUST_id='"&strName&"'"rn Set rs = Server.CreateObject("ADODB.RecordSet")rn rs.Open sql,connrn if rs.eof or rs.bof thenrn F_CheckName=truern elsern F_CheckName=falsern end ifrn rs.closern set rs=nothingrn conn.closern set conn=nothingrnend functionrnrn
简单问题,从C++函数返回一个字符数组
在函数里定义了一个字符数组,然后直接返回该数组指针,结果在外面接的时候,接到一个空指针。我想是因为字符数组是该函数的局部变量,所以在函数返回时被自动释放掉了。现在我不想使用new操作符来初始化该数组,因为这样的话,每次外面接完该数组,又要手工的去DELETE,很麻烦。有没有直接的方法,即可以不用NEW来生成数组,又可以先将数据交给外部变量,然后再自动释放数组?
关于函数返回对象类型的一个简单的问题
看例子:rn[code=C/C++]rn#include rnusing namespace std;rnrnclass Test rnpublic:rn Test() rn cout<<"Test()"<
函数返回类型说明的简单问题(50分征解!!!!)
rn(1)在VC里面有很多函数返回值说明,经常是大写:rn比如AFXAPI。。。等等,不知道什么意思,在MSDN里面找也找不到。。。rnrn(2)而且有的时候,一个函数声明前竟然有多个类型说明,例如:rnBNACTLAPI TBNAError CALLTYPE BNACmdWork (TBNAhandle);rn注:rnBNACTLAPI------ #define BNACTLAPI extern "C" __declspec(dllimport)rnTBNAError------typedef int TBNAError;rnCALLTYPE------#define CALLTYPE __stdcallrnrn(3)不知道#define和typedef有什么区别啊?rnrn以上三点向各位请教!
简单问题,关于函数返回的小CASE??
我调用一函数,该函数要返回几个int 型的整数,我该用什么方法最好呢?若分太少,我会再加!!谢谢了,先!
理解OpenCV中的宏定义 CVAPI(函数返回类型)
读代码时看到语句 CVAPI(IplImage*)  cvCreateImage( CvSize size, int depth, int channels ); 遂想了解下这个CVAPI到底是怎么回事! #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL   CV_EXTERN_C 的宏定义是#define CV_EX...
关于函数返回字符串常量的问题
关于函数返回字符串常量的问题标签(空格分隔):c/c++ 首先看下面的代码// 此处省略头文件预处理语句using namespace std;const string&amp; Func() // &amp;去掉 { return &quot;123&quot;; }int main() { string s = Func(); cout &lt;&lt; s &lt;&lt; endl; return 0; }在g++编译下
函数返回指针问题,求解
[code=c]#include rn#include rnrnint *nTest();rnrnint main()rnrn int *an = NULL;rn an = nTest();rn printf("%d", *an);rn while(1);rn return 0;rnrnrnint *nTest()rnrn int an[2] = 1,2;rn return an;rn[/code]rn这样可以打印出an[0]的值,在函数中定义的数组不是分配在栈上的吗?函数结束,会被释放,那么an也应该被释放,能打印出an[0]的值是不是因为这个区域还没被其他数据覆盖?也就是说这么用是不安全的?rn另外[code=c]#include rn#include rnrnchar *nTest();rnrnint main()rnrn char *an = NULL;rn an = nTest();rn printf("%s", an);rn while(1);rn return 0;rnrnrnchar *nTest()rnrn char an[2] = "a";rn return an;rn[/code]这个打印出来是乱码,栈空间被释放了,an是野指针,所以乱码?而将printf改成printf("%c",*an),可以打印出a,这是怎么回事?an不也是野指针吗?编译环境都是VC,原来还以为理解这些货了,惭愧。。。。望大神解答,谢谢!
函数返回指针问题
且看以下代码rnrnTClient =Class(TComponent)rnpublicrn ...rnendrnrnPTClient = ^TClient;rnrnClientList: TObjectList; //存放TClient的多个实例rnClientList.Add(TClient.Create);rnClientList.Add(TClient.Create);rnrnfunction TService_Provider.LocateClient(SocketID:Cardinal):PTClient; //返回指针rnvarrn i:integer;rnbeginrn i:=0;rn result ^:= TClient(ClientList[i]);//这里返回第一个实例,编译是成功的,但是运行时出现异常!!!!!请问还有什么好的写法吗?rnend;
函数返回地址的问题
假设我已经建立好一个带头结点的单链表,现在我想写一个Locate函数来返回第i个结点的地址,如果在函数里定义一个指针返回第i个结点的地址,这是不可取的,因为不能返回一个局部指针的地址。对这个链表操作那么就要传入这个链表的有指针,如果在形参列表中传入头指针的话,那么在函数过程中头指针将会发生变化,请问这个Locate函数的形参列表该怎么写?请高手帮分析一下,在线等。
SecondsIdle函数返回问题
function SecondsIdle: DWord;rnvarrn liInfo: TLastInputInfo;rnbeginrn liInfo.cbSize := SizeOf(TLastInputInfo) ;rn GetLastInputInfo(liInfo) ;rn Result := (GetTickCount - liInfo.dwTime) DIV 1000;rnend;rnrnprocedure TForm1.Timer1Timer(Sender: TObject);rnbeginrn Caption := Format('System IDLE last %d seconds', [SecondsIdle]) ;rn if SecondsIdle >=5 thenrnBeginrnMessageBox(0,'>=5','提示',MB_OK);rnend;rnend;rnend.rn--------------------------------------------------------------------------------------rn如何让rn if SecondsIdle >=5 时!rnSecondsIdle 归0重新开始rn
函数返回局部变量地址的问题.........
3。作为返回值时不同。rnrnchar* test()rnrnchar ch[5]='h','i';//gcc 会警告:返回局部变量。rnrnreturn ch;rnrn}rnrn这个函数是错误的,因为字符数组ch是局部变量,当test调用结束是占用的空间将被释放。rnrn改为:static char ch[5]='h','i';rnrn或: char* ch=”hi”;rnrn就可以了rnrn地址:http://blog.chinaunix.net/u2/68623/showart_716310.htmlrn我对于这里:“或: char* ch=”hi”;”这里它说可以这么定义返回它就是没有问题的,我感觉还是存在问题,因为这个ch变量指向的常量分配的栈上,当函数结束的时候自动回收,返回的地址已经没有什么意义!rn不知道大家有什么看法???rn下面有一个,char s[] = "abc"; 栈上 那么我想char* ch=”hi”;也是在栈上的,请高手指点下,最近头脑有点短路!!rnint a = 0; 全局初始化区 rnchar *p1; 全局未初始化区 rnmain() rn rnint b; 栈 rnchar s[] = "abc"; 栈 rnchar *p2; 栈 rnchar *p3 = "123456"; 123456\0在常量区,p3在栈上。 rnstatic int c =0; 全局(静态)初始化区 rnp1 = (char *)malloc(10); rnp2 = (char *)malloc(20); rn分配得来得10和20字节的区域就在堆区。 rnstrcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 rn rn地址:http://www.loveunix.net/archiver/tid-85612.htmlrn请高手讲解下局部变量地址或引用返回值的问题和注意事项!!rn
send函数返回EAGAIN问题
在使用socket时 send()返回的是成功copy到socket缓冲区的数据大小 rn如果返回-1的话 我查了一下 好像是socket缓冲区剩余空间大小小于要发送的数据长度 也可以说缓冲区满了rn那如果我这边缓冲区没满 而接收方的缓冲区满了 send()应该返回什么呢 rn我这边返回的异常信息是EAGAINrnrn请大家帮忙指点!
函数返回char&的问题
[code=C/C++]char& CMyString::GetAt( int nIndex )const rnrn if (nIndex <= 0 || nIndex > m_nStrLen)rn rn return -1; [color=#FF0000]//这里我要返回-1 代表错误,可是定义的函数返回值为cha&rn //强转-1也不行,求教有啥好办法[/color] rn return m_lpMyString[nIndex + 1];rn[/code]
函数返回数组问题
下面这段代码为何可以正确输出呢?局部变量在退出函数后不是会被清空吗?rn#include "stdio.h"rnchar* throwMesinfo()rn rn char buf[1024] ="bac";rn return buf;rnrnint main()rnrn char *p = NULL;rn p = throwMesinfo();rn printf("%s\n",p);rn return 0;rnrn[img=https://img-bbs.csdn.net/upload/201904/22/1555902416_571567.jpg][/img]
函数返回字符串变量的问题
[code=c]void *FieldServer::sqlQueryFunction(const unsigned short &majorCmd,const unsigned short &minorCmd,const void* inputStr)constrnrn void *pTemp;rn QSqlQuery m_Query;rn QString strSql=QString((char*)(inputStr));rn m_Query.exec(strSql);rn rn if (m_Query.next())rn rn //std::string str = m_Query.value(0).toString().toStdString();rn //const char* ch = str.c_str();rn //pTemp = (void *)ch;// &m_Query.value(0).toString();rn /*char* ch;rn QString str = m_Query.value(0).toString();rn QByteArray ba = str.toLatin1();rn ch=ba.data();rn pTemp =(void *) ch;*/rn QString str = m_Query.value(0).toString();rn QByteArray ba = str.toLatin1();rn pTemp = "123";//(void *)ba.data();rn rn return pTemp;rnrn[/code]rnrn大致是这么一段代码,从数据库里查询一个数据然后返回,返回值是void*,如果返回常量当然OK,返回变量就会出现临时变量被销毁,地址内容为乱码的情况,请问该如何解决呢?谢了
编写函数返回一维数组问题
现有一个字符串"123,456,852,751,965,325,46858,4654",想编一个以逗号分解这个字符串,然后返回rn一个一维数组,类似VB中的Split函数的函数,用delphi写。这个函数如何编写?谢了!
sigset调用函数返回问题。
求解:rnint flag=0;rnrnmain()rnrn sigset(SIGALRM, msg_to);rn alarm(60);rnrn ret=msqRcv(..........);rn if(ret<0 && flag==1)rn rn 打印。。;rn 退出或怎么的;rn rn ....;rnrnvoid msg_tornrn 打印啥的;rn flag=1;rnrnrn怎么改才能使语句执行到if,而不是一直在那等接受socketid的内容?rn
函数返回多个值的问题
各位老师:rnrn 请教一下如何实现一个函数返回多个值的问题,如下.我要同时返回a,b的值,如何实现?谢谢rn Public Function ReturnMultiValue() As Stringrn a = 1rn b = 2rn ReturnMultiValue = arn End Function
菜鸟问题,函数返回的数据类型?
public ...... GetData(string sqls)rnrn DataSet ds = new DataSet(); rn SqlDataAdapter myCommand = new SqlDataAdapter(sqls,conn); rn myCommand.Fill(ds, "class"); rn return ds.Tables["class"].DefaultView;rnrnrn上面是我的代码rn我要返回ds.Tables["class"].DefaultView;数据rn在定义GetData(string sqls)时我应该如何写?
函数返回对象的问题
测试一段代码的时候发现了一个问题。rnrn#include "stdio.h"rnrnclass Xrnrn int i;rnpublic:rn X(int I = 0) i = I; rn printValue() printf("i = %d\n", i);rn;rnrnX f()rnrn return X();rnrnrnvoid main()rnrn X x = X(3);rn x.printValue();rnrn f() = X(5); rn f().printValue();rn return;rnrnrn按照我的理解,f().printValue应该返回5才对,结果却是0,不解,请执教。rnrn能否解释一下函数X f()的工作原理?谢谢。
void函数返回的问题
看到有如下的代码:rnvoid FuncExamp(...)rnrn...rnrnrn......rnrnFunction()rnrn......rnif(!FuncExamp())rnrn.....rnrnrn(!FuncExamp())rn这个有什么作用啊?
关于DispatchMessage函数返回的问题
MSDN 上关于该函数是这么说的rnThe DispatchMessage function dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function.rnrnSyntaxrnrnLRESULT DispatchMessage( const MSG *lpmsgrn);rnParametersrnrnlpmsgrn[in] Pointer to an MSG structure that contains the message.rnReturn ValuernrnThe return value specifies the value returned by the window procedure. Although its meaning depends on the message being dispatched, the return value generally is ignored.rnrnReturn Value里写着The return value specifies the value returned by the window procedure.意思应该是说DispatchMessage函数是要到窗口处理函数完成后才返回的(根据窗口处理函数的返回值返回嘛)rnrn但是我在一个窗口处理函数里面写上这样的话rnstatic int m = 0;rncout << "Message5 : \t\t\t\t" << m++ << endl;rn rnMessageBox("5");rnrnfor (int p = 0; p < 15; ++p)rnrn cout << "Message5 : \t" << p << endl;rnrn它执行到MessageBox("5")后就返回了rnrn我是这样测试的,创建一个MFC基于Dialog的程序,按下一个按钮后,发送10几个自定义的命令,按我的理解应该是每处理完一个消息,再接下去处理另外一个消息,把上面的MessageBox("5")函数去掉的话,结果确实是如此.rn但是加了MessageBox("5")这句以后,情况就不是这样了,它是全部处理完MessageBox函数以前的步骤(也是按顺序来,没错),就处理下一条消息了rnrn我想问的是,这是怎么一回事,MSDN上的DispatchMessage有特殊情况例外吗?
关于函数返回指针的问题
我是这样用的:rnrn char *mword;rnrnrn mword=getword();rngetword定义;rnrnchar *getword()rnrn char tt[128]="didkdkdkkdkdk";rnrn return tt; rnrnrn这样用有问题么,我觉得有点不妥,mword没有分配内存,会不会出问题??rn
函数返回指针的问题
#include rn#include rnchar* getz();rnint main()rnrnrnchar *p;rnp=getz();rn//cout<
问个函数返回对象的的问题
函数如下rnpublic DataTable return_dt(string sql)rnrnOleDbConnection con=new OleDbConnection(数据库链接字符)rntryrnrn con.Open();rnrncatch (OleDbException err) rn MessageBox.Show(err.Message); rnOleDbCommand cmd = con.CreateCommand();rncmd.CommandText = sql;//sql语句rnrntryrnrndt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));rnrncatch (OleDbException err)rnrn MessageBox.Show(err.Message + cmd.CommandText);rnrnrncmd.Dispose();rncon.Close();rnreturn (dt);rnrnrnrn函数引用:rnDataTable ab= return_dt(string sql);rnrn现在在内存里是有2个DataTable,及函数处理有1个然后又赋值给了ab ,还是说只有1个DataTable 就是ab
vc函数返回数组问题
一种方式,是定议好二维数组,做为指针传入函数,由函数修改,可这种方法不行,因为我的数组是动态的,是在函数中生成的,不能预知大小的.rnrnrn一种是直接返回一个指针,如下如示rnrnrnint* CDataAcquire::ReadData()rn//读取数据并返回数据数组rn rn int *p=new int[DataLong-1];rn return p;rnrnrn可是int *p是局部变量,如果我析构了类的实例,再调用它,*p就会内存泻漏.rnrn请问高手有什么好方法吗?rnrn另个二维数组是不是只能转换为一维传递才是安全的呢?/rn
关于fork()函数返回的问题
查资料看linux下fork()函数成功执行后有2个返回值:一个是父进程调用fork后的返回值,其值为刚创建的子进程的IDrnrn;另一个是子进程中fork函数的返回值,其值为0。rn编写测试程序rn#include rn#include rn#include rnint main(void)rnrn pid_t pid;rn printf("Process Creation Study\n");rn pid = fork();rn switch(pid) rn case 0:rn printf("Child process is running\n");rn break;rn case -1:rn perror("Process creation failed\n");rn break;rn default:rn printf("Parent process is running\n");rn break;rn rn exit(0);rnrn程序执行的结果是:rnProcess Creation StudyrnChild process is runningrnParent process is runningrn根据打印结果,fork()函数确实返回了0和非0两个值,而且是先返回了0值。我想用gdb单步调试确认这个结果,在第7行设置断点,执行next,然后print pid,发现始终没有0值出现。请问这是为什么?
c++初学者函数返回问题
函数返回类对象时为什么调用复制构造函数而不是构造函数n函数返回类对象时为什么调用复制构造函数而不是构造函数nn
关于函数返回clob的问题
create or replace function testclob return clobrnasrn v_clob clob;rn s varchar2(1000);rnbeginrn s:='1111';rn dbms_lob.createtemporary(v_clob,FALSE,DBMS_LOB.CALL);rn dbms_lob.open(v_clob,dbms_lob.lob_readwrite);rn rn dbms_lob.writeAppend( v_clob, length(s), s );rnrn dbms_lob.close(v_clob);rn return v_clob;rnend;rn我执行的时候会报 ORA-03127 :在活动操作结束之前不允许进行新的操作
关于函数返回引用的问题
C++ Primer中说程序员应当知道下面一个易犯的错误:rnrn********************************************************************rnrn1、返回一个指向局部对象的引用rnrn但我看不明白下面的例子rnMatrix& grow( Matrix* p )rnrn matrix *res;rn // 在动态存储中分配一个更大的Matrixrn // res是指向新Matrix的指针rn // 将*p内容复制到*resrn return *res;rnrnres不是一个局部对象吗?不明白???这个例子好像错了???函数定义rn返回值为Matrix&,可函数却返回了一个指针????怎么回事????rn rn既然不能返回指向局部对象的引用,那返回值是不是只能定义为全局或者向下rn面的情况,函数的形参为引用类型,是不是这样子?rnconst int &get_val( vector &vi, int ix )rnrn return vi[ix];rnrnrn*********************************************************************rnrn还有一个小问题?rn#include rn#include rnrnusing namespace std;rnrn#pragma warning(disable: 4786)rnrnint ai[4] = 0, 1, 2, 3;rnvector vec( ai, ai+4 );rnrnint main()rnrn vector vec( ai, ai+4 );rnrn return 1;rnrn我写了两个相同的定义vector vec( ai, ai+4 ); 为什么可以通过运行?
SHGetSpecialFolderLocation()函数返回错误的问题
我照书上例子做一个显示网上邻居的工程,程序运行后弹出了网上邻居窗口,但是编辑控件中没有显示东西。rn我自已查了下发现这个函数返回为FALSE,没有成功。SHGetSpecialFolderLocation(GetSafeHwnd(),CSIDL_NETWORK,&mm_pidlRoot);rn但是这个函数就三个参数,我看不出哪里出错了。rnrn我的环境是Windows XP SP3 Visual C++6.0rnrn////////下面是该功能的代码,编译通过///////////////////////////////////////////////////rnvoid CMyDlg::OnNab() rnrn // TODO: Add your control notification handler code herern LPITEMIDLIST mm_pidlRoot = NULL;rn //GetSafeHwnd函数返回窗口句柄,调用SHGetSpecialFolderLocation()rn //函数打开“网络邻居”文件夹,并把其地址赋给mm_pidlRootrn SHGetSpecialFolderLocation(GetSafeHwnd(),CSIDL_NETWORK,&mm_pidlRoot);rnrn CString mm_strDisplayName;rn BROWSEINFO mm_bi;rnrn //bi各成员清0,以便后面写入rn memset(&mm_bi,0,sizeof(BROWSEINFO));rn mm_bi.hwndOwner = GetSafeHwnd();rn mm_bi.pidlRoot = mm_pidlRoot;rn mm_bi.pszDisplayName = mm_strDisplayName.GetBuffer(MAX_PATH+1);rn mm_bi.lpszTitle = "查找计算机";rn mm_bi.ulFlags = BIF_BROWSEFORCOMPUTER;rnrn //弹出网上邻居窗口rn LPITEMIDLIST mm_pidl = SHBrowseForFolder(&mm_bi);rn mm_strDisplayName.ReleaseBuffer();rnrn if(mm_pidl)rn rn m_Nab = mm_strDisplayName;rn UpdateData(FALSE);rn rnrn IMalloc *pMalloc = NULL;rn SHGetMalloc(&pMalloc);rn pMalloc->Free(mm_pidlRoot);rnrn
函数返回一个类时的问题
说rnX bar()rn X xx;rn return xx;rnrn会转化为rnvoid bar(X &result)rn ...rn return;rnrn还说rnX xx=bar();rn会被转化为rnX xx;rnbar(xx);rn这好理解,但是没说像下面这样,会转化为什么rnbar();rn哪位DX知道啊?
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件