为什么行为随emplace_back / push_back的顺序变化而变化?为什么构造函数的数量增加?

问题描述 投票:0回答:1
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)=假

程序以退出代码结束:0

class Buffer {unsigned char * ptr {nullptr}; size_t长度{0}; public:Buffer():ptr(nullptr),length(0){std :: cout <

c++11 move-semantics push-back
1个回答
0
投票

[new unsigned char[obj.length] {0}obj.length == 0时表现出不确定的行为。

[expr.new] / 7

© www.soinside.com 2019 - 2024. All rights reserved.