std :: vector и Конструкторы - PullRequest
0 голосов
/ 03 июня 2011

Какой конструктор вызывает std :: vector при создании нового экземпляра объекта, который он содержит? У меня сложилось впечатление, что он вызывает конструктор по умолчанию, но что, если он не определен или компилятор делает это для меня?

Особенно в случае как таковом:

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

Как узнать, сколько памяти выделяется, когда объект имеет неизвестный размер, до окончания строительства?

Ответы [ 2 ]

7 голосов
/ 03 июня 2011

Как минимум, для 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 Конструкция по умолчанию

Конструктор по умолчанию не требуется. Некоторые сигнатуры функций-членов класса контейнера указывают конструктор по умолчанию в качестве аргумента по умолчанию. T() должно быть четко определенным выражением (8.5), если одна из этих сигнатур вызывается с использованием аргумента по умолчанию (8.3.6).

1 голос
/ 03 июня 2011

Что произойдет после исправления ошибки:

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

означает, что у вас есть два экземпляра Foo, указывающих на один и тот же буфер data.Возможно, он будет работать некоторое время, но в конечном итоге оба объекта будут уничтожены, деструктор вызывается дважды (или более, в зависимости от того, нужно ли vector перемещать содержимое), и буфер освобождается дважды, что приводит кнеопределенное поведение (что обычно означает сбой).


Чтобы обратиться к начальному содержимому vector, он копирует конструкцию, которую вы передаете в качестве параметра (по умолчанию этот параметр создается по умолчаниюобъект, но не обязательно):

std::vector<Foo> myVector(10, bar); // 10 copies of bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...