diff options
author | Subv <subv2112@gmail.com> | 2014-07-10 16:01:11 -0500 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2014-07-10 16:01:11 -0500 |
commit | 128217c4c48140103151bfaed5347f35ffce28f5 (patch) | |
tree | 7c44c88679abc9f7f0828e2e0d14543bc627b45d /src | |
parent | e84ba172a7aa6df6541460ea279c0e65875f9e45 (diff) |
Prevent the WorldSocket from being deleted when there's still an async write operation going on.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 0a2619eeb3e..a77c253ce1a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -163,12 +163,15 @@ void WorldSocket::AsyncWrite(WorldPacket const& packet) if (!packet.empty()) std::memcpy(data + header.getHeaderLength(), (char const*)packet.contents(), packet.size()); + // Use a shared_ptr here to prevent leaking memory after the async operation has completed std::shared_ptr<char> buffer(data, [=](char* _b) { - delete[] _b; + delete[] _b; // Ensure that the data is deleted as an array }); - boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, buffer](boost::system::error_code error, std::size_t /*length*/) + auto self(shared_from_this()); + + boost::asio::async_write(_socket, boost::asio::buffer(buffer.get(), header.getHeaderLength() + packet.size()), [this, self, buffer](boost::system::error_code error, std::size_t /*length*/) { if (error) { |