Он не называется , когда вы push_back
, он называется , когда временный уничтожен .
Чтобы исправить это в вашем примере:
TEST test;
for (int i = 0; i < 5; ++i)
{
m_test.push_back(test);
}
Должен звонить только один раз.
Ваш код создает временный TEST
внутри цикла, используя его в push_back
, затем этот временный объект выходит из области видимости, когда цикл заканчивается / повторяется и уничтожается. Это происходит именно так, как и должно быть, поскольку временная TEST
нуждается в очистке.
Если вы хотите избежать этого, вам нужно делать что-то еще, кроме создания временного объекта для каждого толчка. Одним из возможных решений является:
vector<TEST> m_test(5); // Note reserving space in the vector for 5 objects
std::fill(m_test.begin(), m_test.end(), TEST()); // Fill the vector with the default ctor
В зависимости от того, как оптимизирован ваш STL, может не потребоваться делать несколько копий.
Вы также сможете улучшить обработку, если реализуете конструктор копирования в своем классе TEST
, например:
TEST::TEST(const TEST & other)
{
x = new int(*other.x); // Not entirely safe, but the simplest copy ctor for this example.
}
Является ли это уместным или как вы его обрабатываете, зависит от вашего класса и его потребностей, но обычно вы должны иметь конструктор копирования, когда вы определили свой собственный обычный конструктор и деструктор (в противном случае компилятор сгенерирует их, и в в этом случае это приведет к копированию и зависанию указателей на x
).