c++重载=运算符,RAII

c++ overloading =operator, RAII

本文关键字:RAII 运算符 重载 c++      更新时间:2023-10-16

我正在尝试做一个简单的缓冲区,并遵循RAII习语

在main.cpp 中

int main()
{
buffer buf(5);
buffer test(10);
test = buf;

return 0;
}

在buffer.cpp 中

#include "buffer.h"
#include <iostream>
size_t buffer::get_size() const
{
return length;
}
buffer::buffer(size_t length) : start(new int[length]), length(length)
{
std::cout << length << +" size" << std::endl;
}
buffer::buffer(const buffer& rhs) : start(new int[rhs.get_size()]), length(rhs.get_size())
{
std::copy(rhs.begin(), rhs.end(), start);
}
buffer& buffer::operator=(const buffer& rhs)
{
buffer temp = rhs;
std::swap(*this, temp);
return *this;
}
int* buffer::begin()
{
return start;
}
int* buffer::end()
{
return start + length;
}
const int* buffer::begin() const
{
return start;
}
const int* buffer::end() const
{
return start + length;
}
buffer::buffer(buffer&& rhs) noexcept
{
*this = std::move(rhs);
}
buffer& buffer::operator=(buffer&& rhs) noexcept
{
if (this != &rhs) { // if this is not the rhs object
start = rhs.start;
length = rhs.length;
rhs.start = nullptr;
rhs.length = 0;
}
return *this;
}
buffer::~buffer()
{
delete[] start;
}

在缓冲区.h 中

#pragma once
class buffer {
size_t length;
int* start;
public:
size_t get_size() const;
explicit buffer(size_t size);
buffer(const buffer& rhs);
buffer& operator=(const buffer& rhs); 
buffer& operator=(buffer&& rhs) noexcept;
buffer(buffer&& rhs) noexcept;
int* begin(); 
int* end();
const int* begin() const;
const int* end() const;
~buffer();
};

现在,正如您在主buf中注意到的,它的大小比测试的要小。我的问题是test=buf上面一行的test分配的内存会发生什么?

它曾经被清理过吗?或者主管道必须在清理干净之前完工。

test分配的原始数组将在副本分配中交换到temp对象,并在该对象超出范围时释放。

但是移动分配存在内存泄漏,在从rhs获取新数组之前,必须先释放旧数组。

通常,我建议使用unique_ptr而不是手动分配。