【发布时间】:2020-07-20 21:55:02
【问题描述】:
我的BitMap 课程中的operator= 有问题。我遇到了一些内存泄漏,所以我决定从原始指针更改为std::unique_ptr。当我这样做时,我注意到每当我使用我的
BitMap赋值运算符,我得到一个错误:
function "sp::BitMap::BitMap(const sp::BitMap &)" (隐式声明)不能被引用——它是一个被删除的函数
.h 文件
#include "color.h"
#include "spmath.h"
#include <memory>
namespace sp
{
//Bitmap: saves pixel position in the image
class BitMap
{
public:
BitMap();
BitMap(const vector2i& pos, const vector2i& size);
~BitMap() { }
BitMap& operator=(BitMap bm);
void marge(BitMap& bm);
void marge(BitMap* bm, int obj_count);
void calculateNewRect(const BitMap& bm, sp::vector2i* pos, sp::vector2i* size);
void calculateNewRect(const BitMap* bm, int obj_count, sp::vector2i* pos, sp::vector2i* size);
void margeToBitMap(BitMap& target, BitMap& bm);
public:
//bool* m_pixelMap;
std::unique_ptr<bool[]> m_pixelMap;
vector2i m_startPos;
vector2i m_size;
};
//--------------------------
}
.cpp 文件
//-----------------------------------------------------
sp::BitMap& sp::BitMap::operator=(BitMap bm)
{
//if(this->m_pixelMap != nullptr)
// this->clear(); //Delete last pixel_map
this->m_startPos = bm.m_startPos; //Copy position
this->m_size = bm.m_size; //Copy size
this->m_pixelMap.reset(bm.m_pixelMap.release()); //Copy ptr to pixel_map
//bm.m_pixelMap = nullptr; //Delete pointer to pixel map
return *this;
}
//-----------------------------------------------------
//-----------------------------------------------------
void sp::BitMap::marge(BitMap& bm) //Margeing to one object
{
//Calcuating new bitmap size
vector2i new_pos = this->m_startPos;
vector2i new_sum_size = this->m_size + new_pos;
calculateNewRect(bm, &new_pos, &new_sum_size);
vector2i new_size = new_sum_size - new_pos;
BitMap marged(new_pos, new_size);
//------------------------------
//Mergeing
margeToBitMap(marged, *this);
margeToBitMap(marged, bm);
//------------------------------
*this = marged; //ERROR
}
//-----------------------------------------------------
【问题讨论】:
-
operator=(BitMap)按值获取参数,这要求它是可复制的,但由于unique_ptr成员,它是不可复制的。 -
@IgorTandetnik 参数也可以移动构造。
-
您使用
bool*或std::unique_ptr<bool[]>而不是使用std::vector<bool>(或std::vector<uint8_t>,如果您想避免奇怪的std::vector<bool>专业化)是否有特殊原因?跨度>
标签: c++ pointers smart-pointers