C++编程技巧(长期更新)

1.数组使用
int``* p =``new int``[5]();``// 数组新建并全部初始化为0等价于:int``* p;``p =``new int``[5]();``int``* q =``new int``[5];``// array elements all have indeterminate value2.队列的使用。STL模板中,queue只能在读q.front();q.back();必须要要配合pop()函数才能读完所有的队列内容。而deque模板的使用,可以访问到任意位置的数据,读取方法,可以是q.[i],也可以是q.at(i),注意要从0开始读,所以for循环写的时候,要这样子写:加上头文件:#include

for(int i = 0;i < q.size();++i)  
        cout << "q[" << i << "] : " << q[i] << endl;  
    cout << endl;

还有将一个结构体变量放进队列的时候内存泄漏是个很大的问题。在结构体里面谨慎的使用指针,看下面的一个例子。

定义了一个结构体变量:

struct MyStruct
{
    Mat irdata;
    Mat depthdata;
    float *array;
};

其中包含了两个mat矩阵。和一个float矩阵的指针。

在调用的时候千万要注意,

#include "que-mat.h"

using namespace cv;
using namespace std;
int cnt = 0;
int k = 0;
int p, q;
MyStruct s_copy;
std::deque<MyStruct> qe;
MyStruct s1;
MyStruct s2;
bool matqueue(Mat inputdata1, Mat inputdata2, float *array1)
{
    cnt++;
    //s1.array = new float[20]{};
    //插入队尾
    s1.irdata = inputdata1;//调用问题,这里因为指向了同一个内存,所以必须clone()一下。   s1.depthdata = inputdata2;
    s1.array = array1;//调用问题,该指针一直指向了同一片内存空间,所以会被不停的刷掉,所以永远只有最后一个数据失是正确的,其他存储数据都是乱码   qe.push_back(s1);
    int n = qe.size();
    if (qe.size() > 10) qe.pop_front();
    cout << "队列大小 " << n << endl;
    s_copy = qe.back();
    if ((s_copy.array[1] == 1) || (s_copy.array[1] == 2)){
        //    if (n == 10){
        for (int j = 0; j < 10; j++){
            k++;
            //s_copy.array = new float[20]{};
            s2 = qe.back();
            cout << "队列大小 " << qe.size() << "s2.array " << s2.array[0] << endl;
            save_image(s2.irdata, s2.depthdata, 224, 171, k);
            save_txt(s2.array, k);
            //队首出栈
            qe.pop_back();
        }
    }

    if (cnt == 80){
        waitKey(0);
    }

    // 判断队列是否为空
    if (qe.empty()){
        std::cout << "Enpty" << std::endl;
        return 0;
    }
    return 1;
}

问题已经指出来了,然后怎么写呢,

s1.irdata = inputdata1.clone();
s1.depthdata = inputdata2.clone();
//申请一个空间,再memset进去
s1.array=(float*)malloc(20*sizeof(float));

memset(s1.array,&array,80);//将数据填充进去
qe.push_back(s1);

关于内存机制,需要不断的学习,修改后的代码还有一个问题,就是为调用迅速将文件中参数引用也发生了修改

bool inque_mat(const Mat &inputdata1, const Mat &inputdata2, GestureInfo gestureInfo);

const Mat &inputdata1。这样子调用比较稳定。
原文链接: https://www.cnblogs.com/Anita9002/p/6201981.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/246163

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午1:19
下一篇 2023年2月14日 上午1:20

相关推荐