Добрый день. Прошу помощи. Сейчас изучаю наследование классов 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();
}
В
B(A &aA)
{
Z = aA.get_Z();
}
вы присваиваете полю Z значение, которое оно имеет в aA (as в main). Затем освобождаете его как в деструкторе as, так и в деструкторе cv.
Два раза одну память освобождать нельзя...
Еще в конструкторе
A::A(char *z)
вы не присваиваете значение M, и оно указывает не пойми куда. В деструкторе вы освобождаете это не пойми что, что тоже делать никак нельзя.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей