2010-08-26 1 views
0

я получил свой код, как следующее:C++ Наследование: Деструктор не дозвонились

class TimeManager 
{ 
public: 
virtual ~TimeManager(); 
}; 

class UserManager : virtual public TimeManager 
{ 
public: 
virtual ~UserManager(); 
}; 

class Server : virutal public UserManager 
{ 
virtual ~Server(); 
}; 


CServer *pServer; 

DWORD WINAPI ServerHelper(void*); 

int main() 
{ 
//Create server 
CreateThread(NULL, 0, ServerHelper, NULL, 0, NULL); 

std::cin.get(); 

//delete server 
delete pServer; 

std::cin.get(); 

return 0; 
} 

DWORD WINAPI ServerHelper(void *v) 
{ 
pServer = new CServer; 

return 0; 
} 

Моя проблема - думаю, - что мои won't деструкторов сервера дозвонились ...

я могу «Представьте себе, почему:/... (я написал выходные функции во все три класса, и конструктор сервера ничего не выводит, но оба они делают ... сразу после SECOND! key-hit ... (почему второй и не сразу после удаления?)

A юбые подсказки, советы, решение? ....

Я использую Visual Studio 2010

+0

Является ли переменная pServer сервером или сервером? – Starkey

+0

Что такое 'CServer'? –

+0

Исправьте свои опечатки, а затем, возможно, кто-то может ответить на ваш вопрос. Как известно, кто знает, что wtf происходит, потому что код, который вы опубликовали, не компилируется и, следовательно, не является примером вашей проблемы. –

ответ

1

Хорошо ... Я нашел решение problems':

Я начал главный цикл из конструктора серверов:

Server::Server() 
{ 
MainLoop();  // <- Loop in there... 
} 

Я зафиксировал его, запустив сервер вручную с помощью дополнительной функции и теперь все в порядке: D ...

Спасибо всем, кто участвовал:) ...

2

Возможно, вы смотрите на классе неверного сервера. Вы создаете экземпляр CServer, а определение класса, которое вы показываете, относится к классу Server. (В качестве альтернативы это также может быть опечаткой в ​​вопросе.)

Кроме того, если вы нажимаете на клавиатуру слишком быстро, до создания нового потока и запускаете функцию ServerHelper, вы можете выполнить команду delete до создания сервера , delete будет просто видеть нулевой указатель и ничего не делать, реальный объект сервера, который создается позже, не будет уничтожен.

+0

это просто опечатка ... серверный класс не слишком большой и получил регистратор, который говорит мне, что все настроено ... и работает ... , даже если я подожду минуту и ​​нажмите , подождите минуту, и нажмите второй ход ... он не получится вызван ... – Incubbus

0

CServer какой-либо другой класс, не определенный вами? ваш класс определяется как Server, но вы создаете сервер CServer.

+0

Это то же самое ... как над его просто опечаткой ... – Incubbus

0

Итак, я попытался скомпилировать этот код, и он не компилируется даже после исправления опечаток. Я исправил опечатки и сделал ваш деструктор сервера общедоступным, и все работает так, как я ожидал. сначала вызывается деструктор сервера, второй - UserManager и TimeMangager.

+0

Omg ... Вы действительно думаете, что я сделал скопируйте этот код из моего реального кода? ... Я просто написал его вручную здесь ... КУРС: constr uctor & desctructor являются общедоступными, у них есть тело;), в нем есть std :: cout ... PLease не делает несколько ответов ... писать комментарии --------> "Добавить комментарий « – Incubbus

+0

ну, если вы хотите получить реальную помощь, вам следует опубликовать код, который будет работать в будущем. после того, как я исправил код, он работает должным образом, поэтому я не уверен, что не так с вашим кодом, тем более, что я не знаю, как выглядит ваш «настоящий код». удачи. – Chris

+0

@incubbus: Люди помогут вам с кодом, который вы публикуете. Если вы отправляете код, который не компилируется, это затрудняет нашу задачу. Сделайте ваши примеры простыми, достаточными и правильными, и вы получите более качественные ответы. – Bill

1

Используя эти определения класса (и все остальное идентично тому, что вы вывесили)

class TimeManager 
{ 
public: 
virtual ~TimeManager() { cout << "~TimeManager" <<endl; } 
}; 

class UserManager : virtual public TimeManager 
{ 
public: 
virtual ~UserManager() { cout << "~UserManager" <<endl; } 

}; 

class CServer : virtual public UserManager 
{ 
public: 
virtual ~CServer() { cout << "~CServer" <<endl; } 
}; 

Running дисплей

~CServer 
~UserManager 
~TimeManager 

между первым & второй раз я нажимаю войти --- Точно как можно было бы ожидать. Кажется, ваша проблема в другом месте.

Обратите внимание, что в классе CServer имеется ряд опечаток, в частности, это иногда «CServer» и другие «Сервер». Кроме того, «виртуальный» ошибочен, а dtor является конфиденциальным. Но любой из них помешал бы его компиляции, а не вызвал ошибку во время выполнения.

ЗАМЕЧАНИЕ также, что код, как вы его разместили, не нуждается в виртуальном наследовании. Вы либо ненужно бросаете ключевое слово вокруг, либо ваши классы более сложны, чем вы допускаете.

+0

они сложнее ... это слишком много кода, чтобы опубликовать все это ... – Incubbus

+1

@Incubbus вы очищаете поток, как в коде выше, с endl? –

 Смежные вопросы

  • Нет связанных вопросов^_^