Я бы начал изучать C++, и я не понимаю, что это утечка памяти или какая-то магия вуду ?!Вызов статической функции на удаленном объекте
У меня есть «одиночки» класса (только для демонстрации):
#include <iostream>
using namespace std;
class S {
private: S() {
cout << "S::S" << endl;
}
public: static S* instance() {
static S* i;
if(i == NULL) {
cout << "Create S" << endl;
i = new S;
}
return i;
}
public: virtual ~S() {
cout << "S::~S" << endl;
}
public: void a() {
cout << "S::a" << endl;
}
};
int main() {
// call some method
S::instance()->a();
// delete pointer to instance (no reason, because I'm curious)
delete S::instance();
// call method again
S::instance()->a();
return 0;
}
выход из них:
Create S
S::S
S::a
S::~S
S::a
Так что мой вопрос: Почему после деструктора звонка я до сих пор работает копировать класс S в статическую переменную?
Обновление: Спасибо за ответы. Я понимаю свои ошибки. Пожалуйста, простите меня за беспокойство.
Вы не имеете рабочую копию, у вас есть * оборванных * указатель и действительно вызывая неопределенное поведение .. (кстати - вам не нужно 'общественности:' перед тем * каждый метод * это не java .. – Nim
(btw - нисходящим избирателям - немного суровым, чтобы проголосовать за новичком - специально, без каких-либо замечаний относительно почему!) – Nim
'Я не понимаю, что это утечка памяти или какой-то вид из магии вуду. Суть в том, что в отличие от большинства других языков, в C++ выполнение «плохих вещей» не означает, что код сработает, получит трассировку стека, появится окно с сообщением «вы сделали плохое», и т. д. Таким образом, ответы, которые вы получаете не только примените к вашему вопросу, но любой «ореховый» код на C++, который происходит с компиляцией без ошибок, но, похоже, работает нормально. – PaulMcKenzie