繁体   English   中英

std::vector 和构造函数

[英]std::vector and Constructors

std::vector 在创建它包含的 object 的新实例时调用哪个构造函数? 我的印象是它调用了一个默认构造函数,但是如果一个没有定义或者编译器为我做这件事怎么办?

特别是在这样的情况下:

class Foo
{
    public:
        Foo(int size)
        {
            data = new double[size];
        }


        ~Foo()
        {
            delete[] data;
        }

    private:
        double* data;
};

std::vector<Foo> myVector;
Foo bar(5);
myVector.push_back(bar);
//stuff

当 object 在构建之前的大小未知时,它如何知道要分配多少 memory?

至少,要编译std::vector<T>T必须是可复制构造和可复制赋值的。 如果要使用std::vector<T>::vector(int) (或std::vector<T>::resize() ),则T必须是可默认构造的。 如果不满足这些要求中的任何一个,则代码将无法编译。

...

C++03 标准,第 23.1 节(一般讨论容器):

这些组件中存储的对象类型必须满足CopyConstructible类型 (20.1.3) 的要求,以及Assignable类型的附加要求。

第 20.1.4 节:

20.1.4 默认构造

默认构造函数不是必需的。 某些容器 class 成员 function 签名将默认构造函数指定为默认参数。 如果使用默认参数 (8.3.6) 调用其中一个签名,则T()应是定义明确的表达式 (8.5)。

修复错误后会发生什么:

std::vector<Foo> myVector;
myVector.reserve(10);
myVector.push_back(bar);

是你有两个Foo实例指向同一个data缓冲区。 它可能会工作一段时间,但最终两个对象都被销毁,析构函数被调用两次(或更多,取决于vector是否需要移动其内容)并且缓冲区被双重释放,导致未定义的行为(这通常意味着崩溃)。


为了解决vector的初始内容,它复制构造您作为参数传入的模式(此参数默认为默认构造的 object,但并非必须如此):

std::vector<Foo> myVector(10, bar); // 10 copies of bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM