释放队列元素包含的指针指向的区域问题
2018-02-02 14:05
239 查看
先看程序:
备注:这个问题是在某个项目里遇到的。工程一创建了队列并push元素,然后将指向该队列的指针传给工程二。工程二里使用完后pop该队列。这时,pop操作时不执行队列元素的析构函数。所以,需要将pop操作封装,再将封装后的函数交给工程二调用,此时,正常执行pop操作,即析构被执行。
在结构IMG里,有一个指针img指向一块内存区。一般情况下正常执行push和pop是可以的。当重复执行push和pop次数达到上万或上百万时,内存会溢出。因为队列pop后,被抛弃的头元素和它指向的内存成了“野区”,没有被指,也无法被用,直到程序结束被彻底释放。内存空间有限,所以数据量特别大时,需要不停的释放。于是在析构里加入delete。在程序执行结束,析构会被再次调用,所以加入一个开关控制,防止被二次delete。
在析构函数中打断点,可以看到断点处跑了四次。分别是两次pop各执行一次,test函数运行结束执行两次。
建议:类比指针,跨工程delete也可以执行,但不鼓励这样做。
#include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <queue> using namespace std; bool DESTRUCT = true; struct IMG { char *img; int size; IMG(){} ~IMG(){ printf("%s", this->img); if (DESTRUCT) { delete[] this->img; this->size = 0; } Sleep(1000); } }; int test() { char *str1 = new char[16]; strcpy(str1, "HelloWorld!\n"); queue<IMG> qImg; IMG _img1; _img1.img = str1; _img1.size = strlen(str1); qImg.push(_img1); qImg.pop(); char *str2 = new char[16]; strcpy(str2, "Hello!\n"); IMG _img2; _img2.img = str2; _img2.size = strlen(str2); qImg.push(_img2); qImg.pop(); DESTRUCT = false; return 0; } int main() { test(); system("\npause"); return 0; }
备注:这个问题是在某个项目里遇到的。工程一创建了队列并push元素,然后将指向该队列的指针传给工程二。工程二里使用完后pop该队列。这时,pop操作时不执行队列元素的析构函数。所以,需要将pop操作封装,再将封装后的函数交给工程二调用,此时,正常执行pop操作,即析构被执行。
在结构IMG里,有一个指针img指向一块内存区。一般情况下正常执行push和pop是可以的。当重复执行push和pop次数达到上万或上百万时,内存会溢出。因为队列pop后,被抛弃的头元素和它指向的内存成了“野区”,没有被指,也无法被用,直到程序结束被彻底释放。内存空间有限,所以数据量特别大时,需要不停的释放。于是在析构里加入delete。在程序执行结束,析构会被再次调用,所以加入一个开关控制,防止被二次delete。
在析构函数中打断点,可以看到断点处跑了四次。分别是两次pop各执行一次,test函数运行结束执行两次。
建议:类比指针,跨工程delete也可以执行,但不鼓励这样做。
相关文章推荐
- 有关new出一个指针,将该指针指向另一个指针,释放不掉的问题
- 有关动态创建释放二维数组,以及指向数组的指针问题集合
- 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
- 双指针指向同一内存的释放问题
- 有关动态创建释放二维数组,以及指向数组的指针问题集合
- 结构体包含二级指针和二级指针内存的申请与释放问题
- 设某循环队列的容量为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有元素个数为?
- 指向vector的指针及空间释放问题 http://bbs.csdn.net/topics/320050082
- 有关动态创建释放二维数组,以及指向数组的指针问题集合 .
- C 指针指向调用函数内部的零时变量问题
- input元素鼠标指向样式问题
- 指向结构体类型的指针强制转换为指向另外一种结构体类型。会不会出现问题?
- set不能通过指针元素指向的成员进行排序
- stl容器内指针元素的使用与释放
- 指向指针的指针的内存分配与释放
- 18指向一维数组元素的指针
- C++关于基类指针指向子类对象的问题
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。