Skip to content

Commit 66809ea

Browse files
committed
Fix memory leak caused by incorrect use of smart pointer.
1 parent 3a3e40a commit 66809ea

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

modules/cudacodec/src/frame_queue.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,32 @@
4646
#ifdef HAVE_NVCUVID
4747

4848
RawPacket::RawPacket(const unsigned char* _data, const size_t _size, const bool _containsKeyFrame) : size(_size), containsKeyFrame(_containsKeyFrame) {
49-
data = cv::makePtr<unsigned char*>(new unsigned char[size]);
50-
memcpy(*data, _data, size);
49+
data = new unsigned char[size];
50+
memcpy(data, _data, size);
5151
};
5252

53+
RawPacket::~RawPacket() {
54+
if (data) delete[] data;
55+
}
56+
57+
RawPacket::RawPacket(const RawPacket& other) : RawPacket(other.data, other.size, other.containsKeyFrame) {
58+
}
59+
60+
RawPacket::RawPacket(RawPacket&& other) noexcept : data(std::exchange(other.data, nullptr)), size(std::exchange(other.size, 0)),
61+
containsKeyFrame(std::exchange(other.containsKeyFrame, false)) {
62+
}
63+
64+
RawPacket& RawPacket::operator=(const RawPacket& other) {
65+
return *this = RawPacket(other);
66+
}
67+
68+
RawPacket& RawPacket::operator=(RawPacket&& other) noexcept {
69+
std::swap(data, other.data);
70+
size = other.size;
71+
containsKeyFrame = other.containsKeyFrame;
72+
return *this;
73+
}
74+
5375
cv::cudacodec::detail::FrameQueue::~FrameQueue() {
5476
if (isFrameInUse_)
5577
delete[] isFrameInUse_;

modules/cudacodec/src/frame_queue.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,16 @@
5050
class RawPacket {
5151
public:
5252
RawPacket(const unsigned char* _data, const size_t _size = 0, const bool _containsKeyFrame = false);
53-
unsigned char* Data() const { return *data; }
54-
size_t size;
55-
bool containsKeyFrame;
53+
~RawPacket();
54+
RawPacket(const RawPacket& other);
55+
RawPacket(RawPacket&& other) noexcept;
56+
RawPacket& operator=(const RawPacket& other);
57+
RawPacket& operator=(RawPacket&& other) noexcept;
58+
unsigned char* Data() const { return data; }
59+
size_t size = 0;
60+
bool containsKeyFrame = false;
5661
private:
57-
cv::Ptr<unsigned char*> data = 0;
62+
unsigned char* data = 0;
5863
};
5964

6065
namespace cv { namespace cudacodec { namespace detail {

0 commit comments

Comments
 (0)