class Buffer
{
unsigned char* ptr{nullptr};
size_t length{0};
public:
Buffer() :
ptr(nullptr),
length(0)
{std::cout<<"\n In Buffer()\n";}
explicit Buffer(size_t const size):
ptr(new unsigned char[size] {0}),
length (size)
{std::cout<<"\n In explicit Buffer(size_t const size)\n";}
~Buffer()
{
if (nullptr != ptr) delete [] ptr;
}
// Causing runtime nullptr exception
// Buffer(Buffer const& obj) :
// ptr(new unsigned char[obj.length] {0}),
// length (obj.getLength())
// { std::cout<<"\n In Buffer(Buffer const& obj)\n";}
// Unnessary Fixed Copy Constructor
Buffer(Buffer const& obj) noexcept
{
std::cout<<"\n In Buffer(Buffer const& obj)\n";
std::cout<<"\n obj Details : Length = "<<obj.getLength()<<std::boolalpha<<": (ptr == nullptr) = "<<(nullptr == obj.getPtr())<<"\n";
if (obj.length == 0)
ptr = nullptr;
else
ptr = new unsigned char[obj.length] {0};
length = obj.length;
}
Buffer& operator=(Buffer const obj)
{
std::cout<<"\n In Buffer& operator=(Buffer const obj)\n";
if (this == &obj) return *this;
delete [] this->ptr;
this->ptr = new unsigned char[obj.length]{0};
this->length = obj.length;
return *this;
}
Buffer(Buffer && data)
{
std::cout<<"\n In Buffer(Buffer && data)\n";
std::cout<<"\n obj Details : Length = "<<data.getLength()<<std::boolalpha<<": (ptr == nullptr) = "<<(nullptr == data.getPtr())<<"\n";
ptr = data.ptr;
length = data.length;
data.ptr = nullptr;
data.length = 0;
}
Buffer& operator=(Buffer&& data)
{
std::cout<<"\n In Buffer& operator=(Buffer&& data)\n";
if (this == &data) return *this;
this->ptr = data.ptr;
this->length = data.length;
data.ptr = nullptr;
data.length = 0;
return *this;
}
size_t getLength() const {return length;}
unsigned char* getPtr() const {return ptr;}
};
--------驱动程序代码---------
std::vector<Buffer> v;
std::cout<<"\nemplace_back()\n";
v.emplace_back();
std::cout<<"\npush_back(Buffer(2))\n";
v.push_back(Buffer(2));
---------通过按书复印构造器输出---------
emplace_back()
在Buffer()中
push_back(Buffer(2))
在显式缓冲区中(size_t常量大小)
在缓冲区中(缓冲区&&数据)
obj详细信息:长度= 2:(ptr == nullptr)=否libc ++ abi.dylib:以类型为std :: bad_alloc的未捕获异常终止:std :: bad_alloc
---------复制构造函数中带有不必要修正的输出---------
emplace_back()
在Buffer()中
push_back(Buffer(2))
在显式缓冲区中(size_t常量大小)
在缓冲区中(缓冲区&&数据)
obj详细信息:长度= 2:(ptr == nullptr)=假
在Buffer(Buffer const&obj)]中>
obj详细信息:长度= 0:(ptr == nullptr)= true程序以退出代码结束:0
--------驱动程序代码---------
std::vector<Buffer> v; std::cout<<"\npush_back(Buffer(2))\n"; v.push_back(Buffer(2)); std::cout<<"\nemplace_back()\n"; v.emplace_back();
---------通过按书复印构造器输出---------
push_back(Buffer(2))
在显式缓冲区中(size_t常量大小)
在缓冲区中(缓冲区&&数据)
obj详细信息:长度= 2:(ptr == nullptr)=假
emplace_back()
在Buffer()中
在Buffer(Buffer const&obj)程序以退出代码结束:0
---------复制构造函数中带有不必要修正的输出---------
push_back(Buffer(2))
在显式缓冲区中(size_t常量大小)
在缓冲区中(缓冲区&&数据)
obj详细信息:长度= 2:(ptr == nullptr)=假
emplace_back()
在Buffer()中
在Buffer(Buffer const&obj)]中>
obj详细信息:长度= 2:(ptr == nullptr)=假
class Buffer {unsigned char * ptr {nullptr}; size_t长度{0}; public:Buffer():ptr(nullptr),length(0){std :: cout <
[new unsigned char[obj.length] {0}
在obj.length == 0
时表现出不确定的行为。
[expr.new] / 7