Наследование классов С++. Ошибка на этапе работы деструктора “Expression: _CrtIsValidHeapPointer(block)”

215
11 июля 2017, 21:39

Добрый день. Прошу помощи. Сейчас изучаю наследование классов C++, и написал небольшой код по этому делу, но программа падает на этапе работы деструктора с ошибкой "Expression: _CrtIsValidHeapPointer(block)". Пишу в Visual Studio 2015. Если не передавать экземпляр класса А в экземпляр класса В, ошибки не возникает.

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
protected:
    char *M;
    char *Z;
public:
    A() 
    {
        M = nullptr;
        Z = nullptr;
    }
    A(char *z) 
    {
        Z = new char[strlen(z) + 1];
        strcpy_s(Z, strlen(z) + 1, z);
    }
    char* get_Z() 
    {
        return Z;
    }
    ~A()
    {
        cout << "Destruct" << endl;
        delete[]M;
        delete[]Z;
    }
};
class B : public A 
{
public:
    B() :A()
    {
    }
    B(A &aA) 
    {
        Z = aA.get_Z();
    }
    void show() 
    {
        cout << "Z2: " << Z << endl;
    }
};
void main() {
    A as("qwerty");
    cout << as.get_Z() << endl;
    B cv(as);
    cv.show();
}
Answer 1

В

B(A &aA) 
{
    Z = aA.get_Z();
}

вы присваиваете полю Z значение, которое оно имеет в aA (as в main). Затем освобождаете его как в деструкторе as, так и в деструкторе cv.

Два раза одну память освобождать нельзя...

Еще в конструкторе

A::A(char *z) 

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

READ ALSO
QPixmap не делает скрин окна веб браузера

QPixmap не делает скрин окна веб браузера

Когда я использую QPixmap::GrabWindow(WId) на окне с веб браузером (например, Chrome), он возвращает мне просто черный экранИспользую следующий код:

199
Как создается диск в оперативной памяти?

Как создается диск в оперативной памяти?

Здравствуйте! Необходимо чтобы часть оперативной памяти определялась как жесткий дискЗнаю о существовании такой утилиты как Dataram RAMDisk, но хотелось...

187
Почему ИИ, который сделан с помощью минимакс алгоритма, иногда проигрывает в человека ? с++

Почему ИИ, который сделан с помощью минимакс алгоритма, иногда проигрывает в человека ? с++

Я сделал небольшую игру крестики-нолики, для ИИ использован минимакс алгоритмНо определенными комбинациями его легко обыграть

380
Бесконечный цикл перед PeekMessage

Бесконечный цикл перед PeekMessage

Всем доброй ночиВсе-таки не успокоюсь, пока не решу окончательно одну проблему

260