C++ Почему деструктор вызывается сразу после создания объекта в стеке?

У меня есть два модульных теста. В первом я создаю объект myMovie в стеке. Объект создается и сразу после этого вызывается деструктор. Это приводит к сбою модульного теста, потому что, когда myMovie выходит за пределы области действия, деструктор вызывается снова. Это приводит к нарушению доступа.

Однако, если я создаю объект в куче, все работает нормально. Почему деструктор вызывается сразу после создания объекта в стеке?

Первый такой:

TEST_METHOD(constructingMovieWithParametersStack)
    {
        _CrtMemState s1, s2, s3;
        _CrtMemCheckpoint(&s1);
        {
            Movie myMovie = Movie("firstName", "lastName", "title");
            // Why is the destructor is called here???

            string expectedDirectorFirst = "firstName";
            string expectedDirectorLast = "lastName";
            string expectedTitle = "title";
            wchar_t* message = L"movie title wasn't set correctly";
            Assert::AreEqual(expectedTitle, myMovie.getTitle(), message, LINE_INFO());
        }
        _CrtMemCheckpoint(&s2);
        wchar_t* leakMessage = L"there is a leak";
        bool isThereALeak = _CrtMemDifference(&s3, &s1, &s2);
        Assert::IsFalse(isThereALeak, leakMessage, LINE_INFO());
    }

Второй модульный тест выглядит следующим образом:

TEST_METHOD(constructingMovieWithParametersHeap)
    {
        _CrtMemState s1, s2, s3;
        _CrtMemCheckpoint(&s1);
        {
            Movie* myMovie = new Movie("firstName", "lastName", "title");

            string expectedDirectorFirst = "firstName";
            string expectedDirectorLast = "lastName";
            string expectedTitle = "title";
            wchar_t* message = L"movie title wasn't set correctly";
            Assert::AreEqual(expectedTitle, myMovie->getTitle(), message, LINE_INFO());
            delete myMovie;
        }
        _CrtMemCheckpoint(&s2);
        wchar_t* leakMessage = L"there is a leak";
        bool isThereALeak = _CrtMemDifference(&s3, &s1, &s2);
        Assert::IsFalse(isThereALeak, leakMessage, LINE_INFO());
    }

Вот класс Movie:

#include "Movie.h"

using namespace std;

Movie::Movie()
{
    this->director = new Person();
    this->title = "";
    this->mediaType = 'D';    // for DVD
}

Movie::Movie(string firstName, string lastName, string title)
{
    this->director = new Person();
    this->director->setFirstName(firstName);
    this->director->setLastName(lastName);
    this->title = title;
    this->mediaType = 'D';    // for DVD
}

Movie::~Movie()
{
    delete director;
}

string Movie::getTitle()
{
    return title;
}

person appleBirdPie    schedule 28.11.2015    source источник
comment
@Leeor: Привет! Добро пожаловать в раздел комментариев. Это для комментариев. Вы пишете комментарии, когда хотите запросить у автора вопроса дополнительную информацию, которая поможет вам ответить на вопрос. Когда вы готовы предоставить решение проблемы, вы пишете ответ. Раздел ответов находится внизу: ↓↓↓↓↓↓↓↓ Спасибо и хорошего дня!   -  person Lightness Races in Orbit    schedule 29.11.2015
comment
@LightnessRacesinOrbit, чувак, нет причин для такого тона. Когда я написал комментарий, ответа еще не было, и я думаю, что на вопросы о фундаментальной концепции можно было бы ответить, просто просмотрев комментарий по теме X, тем более что его, должно быть, уже задавали десятки раз.   -  person Leeor    schedule 29.11.2015
comment
@Leeor: Какой тон? Я изо всех сил старалась быть милой с тобой. Некоторым просто нечем угодить. вздох   -  person Lightness Races in Orbit    schedule 29.11.2015


Ответы (1)


Movie myMovie = Movie("firstName", "lastName", "title");
// Why is the destructor is called here???

здесь создается временный объект и используется для копирования инициализации myMovie, затем временный объект уничтожается.

Вы имеете в виду

Movie myMovie("firstName", "lastName", "title");
person AlexD    schedule 28.11.2015
comment
и если исходный код вызывает нарушение прав доступа, это явный признак сильно нарушенной семантики копирования в Movie. - person Lightness Races in Orbit; 29.11.2015