#include<iostream>
class base{
public:
base(){};
base (base& b) {};
virtual void run(){};
~base(){std::cout<<"destructor for base"<<std::endl;};
};
class derived : public base {
int alpha;
public:
derived (): alpha (0), base() {};
derived (base& b) : alpha(0), base(b) {};
void run(){};
int* get_address() { return &(this->alpha); };
~derived(){std::cout<<"destructor for derived"<<std::endl;};
};
void make_derived (std::shared_ptr<base>& b){
b.reset (new derived());
}
int main(){
std::shared_ptr<base> b;
make_derived (b) ;
std::shared_ptr<derived> d = std::dynamic_pointer_cast<derived> (b);
std::shared_ptr<int> a (d->get_address());
b->run();
}
Я скомпилировал этот код и запустил его. Сообщение об ошибке «освобождение указателя не было». Это довольно распространенное сообщение об ошибке. Я, однако, не понимаю, почему появляется что-то освобожденное. Он умирает сразу после std::shared_ptr<int> a (d->get_address());
. Кто-нибудь знает, как это исправить?C++ указатель, который был освобожден, не был выделен коротким примером
'alpha' был выделен как часть всего объекта' производный'. Объект 'производный' должен быть освобожден, а не его члены. –
@JosephMansfield Хорошо .. тогда я не понимаю, почему 'производный' получает освобожденный – user3089810
Вам не следует создавать объект shared_ptr на основе оператора« address of ». т. е. d-> get_address() недействительно для инициализации shared_ptr (ничего не называемого «new int»). – Charlie