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;
使用您定义的复制构造函数(因为您没有提供移动构造函数)。就在那里,您将分配新的内存并将数据复制到其中。
message_queue.push(std::move(message));
这第二次使用复制构造函数,再次分配新的内存并将数据复制到该数据中。
您现在有三个不同的内存分配,全部泄漏。