c++重载=运算符,RAII
c++ overloading =operator, RAII
我正在尝试做一个简单的缓冲区,并遵循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
而不是手动分配。
相关文章:
- 具有瞬态资源的RAII类
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- c++重载=运算符,RAII