有一种方法可以停止使用队列和具有字符数组的自定义结构的内存泄漏?

问题描述 投票:0回答:1
代码如下

memmove()

我想知道为什么将此项目推到队列上并抓住其内存地址是不同的。地址应该不一样吗?如果我不定义
#include <iostream> #include <queue> struct Message { char* data = nullptr; size_t size = 0; Message() = default; ~Message() { delete[] data; } Message(const Message& other) { this->data = new char[other.size]; this->size = other.size; memmove(this->data, other.data, this->size); } }; std::queue<Message> message_queue; int main() { Message message; message.size = 50; message.data = new char[message.size]; std::cout << &message.data << std::endl; message_queue.push(std::move(message)); Message other_message = message_queue.front(); message_queue.pop(); std::cout << &other_message.data << std::endl; return 0; }
~Message()

,这是一个内存泄漏

Edit:如果我不删除destructor,这肯定是记忆泄漏。但是,为什么内存不在同一位置?
    

delete[] data;

使用您定义的复制构造函数(因为您没有提供移动构造函数)。就在那里,您将分配新的内存并将数据复制到其中。
c++ memory-management queue
1个回答
0
投票
message_queue.push(std::move(message));


这第二次使用复制构造函数,再次分配新的内存并将数据复制到该数据中。 您现在有三个不同的内存分配,全部泄漏。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.