я проблема, что я получаю сообщение «VS вызвало точку останова», и когда я нарушу там, VS прыжки в исходный код POCO NotificationCenter: визуальная студия вызвало точку останова Poco NotificationCenter
I пользуюсь Poco 1.5.4.
Предыдущая запись в стеке вызовов находится в следующем фрагменте коды:
void WebSocketController::HandleReceivedMessages() {
AutoPtr<Notification> notification(receivedMessagesQueue.waitDequeueNotification());
while (!messageHandlerActivity.isStopped() && notification) {
MessageNotification* messageNotification = dynamic_cast<MessageNotification*>(notification.get());
if (messageNotification)
{
notificationCenter.postNotification(messageNotification);
}
notification = receivedMessagesQueue.waitDequeueNotification();
}
}
бетона линии я могу увидеть в стеке вызовов (с номером строки) заключается в следующем:
notification = receivedMessagesQueue.waitDequeueNotification();
Это код MessageNotification.h:
class MessageNotification : public Notification
{
public:
MessageNotification(Message *data);
~MessageNotification();
Message* GetData();
private:
Message *data;
};
Это код MessageNotification.cpp:
MessageNotification::MessageNotification(Message *data) {
this->data = data;
}
MessageNotification::~MessageNotification() {
delete data;
data = nullptr;
}
Message* MessageNotification::GetData() {
return data;
}
И здесь вы можете увидеть конструкторы класса сообщений:
Message::Message(const MessageCommandEnum cmd, const string& to, StringMap *params, const string& data)
: cmd(cmd), to(to), data(data) {
this->params = params == nullptr ? new StringMap() : params;
}
Message::Message(const Message& msg) : to(msg.to), cmd(msg.cmd), data(msg.data) {
params = new StringMap(*msg.params);
}
Message::Message(const Message* msg) : to(msg->to), cmd(msg->cmd), data(msg->data) {
params = new StringMap(*msg->params);
}
Message::~Message() {
if (params != nullptr) {
delete params;
params = nullptr;
}
}
Остальные методы в этом классе только геттеры/сеттеры.
Любая идея, почему это происходит?
Мои исследования сказали мне, что это сообщение возникает, если куча разрушается. Но я не могу найти ни одной строки кода, где это должно произойти. Поведение немного странно, поскольку, когда я нажимаю кнопку «Продолжить» в сообщении, приложения запускаются без каких-либо проблем. У меня нет проблем, когда приложение не запускается с отладчиком в фоновом режиме (например, запустите exe в папке Debug).
Я все еще изучаю C++, поэтому я действительно ценю любую обратную связь/помощь.
Благодаря
Поскольку это происходит при построении копии 'ObserverList', и поскольку' ObserverList' является typedef для 'std :: vector' интеллектуальных указателей (это должно быть довольно безопасно), я подозреваю, что куча разбита. Это означает, что вы написали за пределами другого объекта в куче, который только что лежал непосредственно перед разбитым объектом в памяти (вы работаете с любыми объектами, в которых хранится локальный буфер?] [Char [] ', возможно?) Или через неверный указатель, который только что указывал на несчастливый объект. Использование чего-то после его удаления - хороший способ получить это.Конечно, это все догадки. – Wintermute
Получить Microsoft Application Verifier и включить проверку кучи, чтобы убедиться, что вы испортили что-то очевидное. – Samuel
Я не мог понять никаких проблем с Microsoft Application Verifier - журнал всегда упоминает нулевые ошибки и нулевые предупреждения. – Skully