c++队列元素含指针怎么释放

萝呆子 2018-02-01 05:08:19
我定义了一个结构体
struct IMG{
char *img;
int imgSize;
}
然后声明了一个队列:
queue<IMG> qimg;
声明对象并进队:
IMG _img;
_img.img = new char[100];
_img.imgSize = 100;
qimg.push(_img);
之后用完pop时,如何释放掉这块new出来的内存。
注:直接pop不行,我试过了。
...全文
1054 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
萝呆子 2018-02-02
  • 打赏
  • 举报
回复
引用 5 楼 u010165006 的回复:
delete[]
疏忽了。谢谢! 原因已经找到,在return 0后,析构还会被执行一次,所以会报错。
ooolinux 2018-02-02
  • 打赏
  • 举报
回复
delete[]
萝呆子 2018-02-02
  • 打赏
  • 举报
回复
引用 2 楼 u010165006 的回复:
或者IMG改成类,在构造函数中申请内存,析构函数中释放内存。
那个示例程序写错了,,,下面才是 #include <iostream> #include <queue> #include <Windows.h> using namespace std; class IMG { public: IMG(); ~IMG(); char *str; int size; }; IMG::IMG(){} IMG::~IMG() { delete this->str; this->size = 0; printf("元素被析构!\n"); } int main() { char *str = new char[16]; strcpy(str, "HelloWorld!\n"); queue<IMG> qImg; IMG _img; _img.str = str; _img.size = strlen(str); qImg.push(_img); qImg.pop(); system("pause"); return 0; }
萝呆子 2018-02-02
  • 打赏
  • 举报
回复
引用 2 楼 u010165006 的回复:
或者IMG改成类,在构造函数中申请内存,析构函数中释放内存。
还是不对,这是测试代码,如果不注释delete,执行会崩溃。 #include <iostream> #include <queue> #include <Windows.h> using namespace std; class IMG { public: IMG(); ~IMG(); char *str; int size; }; IMG::IMG(){} IMG::~IMG() { //delete this->str; this->size = 0; printf("元素被析构!\n"); } int main() { char *str = "HelloWorld!\n"; queue<IMG> qImg; IMG _img; _img.str = str; _img.size = strlen(str); qImg.push(_img); qImg.pop(); system("pause"); return 0; }
ooolinux 2018-02-02
  • 打赏
  • 举报
回复
qImg.push(_img); 因为你push的是对象,而不是对象的指针,应该会发生拷贝构造,需要在拷贝构造函数里深拷贝缓冲区成员,不然的话原对象和队列里的对象两个对象的成员共享同一个缓冲区,两个对象的析构造成缓冲区的二次delete出错。
ooolinux 2018-02-02
  • 打赏
  • 举报
回复
IMG _img; 是main函数的局部变量,作用域就是在main函数,main函数结束的时候(离开作用域)会自动析构。
ooolinux 2018-02-01
  • 打赏
  • 举报
回复
或者IMG改成类,在构造函数中申请内存,析构函数中释放内存。
ooolinux 2018-02-01
  • 打赏
  • 举报
回复
先取队列元素,delete[] img 成员。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧