2016-06-07 2 views
2

EDIT: Оказывается, это происходит независимо от того, использую ли я вектор. Он связан с объектами, локальными для функции, имеющей автоматическое разрушение, несмотря на мою попытку явного вызова деструктора.Деструктор, вызываемый дважды

Я пытаюсь понять, почему мой объект, по-видимому, дважды удаляется. Я экспериментировал с классом std :: vector и хотел посмотреть, как было обработано удаление объекта. Может ли кто-нибудь просветить меня относительно того, что происходит в этой ситуации?

Код:

#include<iostream> 
#include<vector> 
#include"DummyClass.h" 
using namespace std; 

void main(void){ 
    //Make vector 
    vector<DummyClass> objVect1; 

    //Make objects to contain 
    DummyClass test; 

    //pass by value 
    objVect1.push_back(test); //makes a pass-by-value copy, I think? 


    //Delete the objects stored in the array 
    objVect1.clear(); // call dtor (vector's copy) 

    test.~DummyClass(); //call dtor on test 
}      //dtor called on test again? 

Консоль вывода:

0033F9DB was constructed 
0062C200 was destructed 
0033F9DB was destructed 
0033F9DB was destructed 

Последний объект разрушается в два раза. Я пытаюсь выяснить, что происходит. Кажется, что конструктор не вызывал аргумент copy-by-value, переданный в вектор. Может ли кто-нибудь помочь мне понять это? Благодаря!

Заголовок класс:

#pragma once 
#include<iostream> 
class DummyClass 
{ 
public: 
    DummyClass(); 
    ~DummyClass(); 
}; 

Класс СРР является:

DummyClass::DummyClass() 
{  
    std::cout << this << " was constructed" << std::endl; 
} 

DummyClass::~DummyClass() 
{ 
    std::cout << this << " was destructed"<< std::endl; 
} 
+0

Вы уверены, что вектор имеет отношение к этому? Вы пытались его удалить? (Риторический вопрос.) – juanchopanza

+0

Собственно, я просто удалил его, и вы правы, вектор не является частью проблемы. –

+0

'void main' дает ** неопределенное поведение **, потому что это неверно. После этого у вас нет гарантий. –

ответ

3

Последний объект деконструкции два раза.

Однажды, когда вы явно уничтожите его, а затем еще раз, когда функция закончится, и все переменные, локальные для функции auto-destruct. Это неопределенное поведение.

Вы почти никогда не должны называть деструктора самостоятельно.

0

Вам не нужно вызывать деструктор в конце вашего основного. Он автоматически вызывается после того, как «тест» выходит за рамки. Удалите последнюю строку вашего основного.

0

push_back() копий test в вектор. Деструктор вызывается в первый раз, когда вектор получает clear() ed, а копия в векторе уничтожается.

Деструктор получает вызов во второй раз, когда вы явно вызываете его.

И в третий раз, когда main() возвращается, и test получает действительно разрушен.

3
DummyClass test; 

Этот объект находится в функции main и будет выходить за рамки, когда main возвращается. (1 деструктор называется)

objVect1.push_back(test); 

Копия DummyClass добавляется к std::vector.

objVect1.clear(); 

Копия уничтожается, когда вызывается clear.(1 деструктор называется)

test.~DummyClass() 

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

Функция деструктора была вызвана 3 раз, как показано выше, для экземпляров объектов . Явный вызов деструктора должен быть удален.

0

Я не могу комментировать, но я думаю, что первый звонок выполняется после clear, а объект test уничтожен; второй вызван вашим вызовом.

Смежные вопросы