visual studio 已触发Poco NotificationCenter断点
visual studio has triggered a breakpoint Poco NotificationCenter
我遇到的问题是我收到消息 "VS has triggered a breakpoint" 并且当我在那里中断时,VS 跳转到 POCO NotificationCenter 的源代码:
我正在使用 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;
}
在这里你可以看到消息的构造函数class:
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;
}
}
此class中的其余方法只有getters/setters。
知道为什么会这样吗?
我的研究告诉我,如果堆被破坏,就会出现此消息。但是我找不到应该发生这种情况的任何代码行。
这种行为有点奇怪,因为当我在消息上按继续时,应用程序运行没有任何问题。当应用程序没有在后台使用调试器启动时,我没有任何问题(例如,启动 Debug 文件夹中的 exe)。
我还在学习 C++,所以我非常感谢 feedback/help。
谢谢
WebSocketController::HandleReceivedMessages() 中的 AutoPtr 通知将在您为它分配另一个指针后立即被 AutoPtr 删除。但是,此时,该指针已传递到另一个 AutoPtr 中的 NotificationCenter,无论您稍后尝试取消引用(或 AutoPtr 尝试删除)它,都会导致未定义的行为。
将通知指针放入 AutoPtr 后,只需将其作为 AutoPtr 传递(使用 notification.cast() 进行转换)。 此外,永远不会传入 MessageNotification 构造函数指针参数,因为您永远不会构造 MessageNotification 对象(您只是将 Notification* 动态转换为 MessageNotification*)。
查看 NotificationQueue example 以了解如何正确执行此操作。
我遇到的问题是我收到消息 "VS has triggered a breakpoint" 并且当我在那里中断时,VS 跳转到 POCO NotificationCenter 的源代码:
我正在使用 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;
}
在这里你可以看到消息的构造函数class:
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;
}
}
此class中的其余方法只有getters/setters。
知道为什么会这样吗?
我的研究告诉我,如果堆被破坏,就会出现此消息。但是我找不到应该发生这种情况的任何代码行。 这种行为有点奇怪,因为当我在消息上按继续时,应用程序运行没有任何问题。当应用程序没有在后台使用调试器启动时,我没有任何问题(例如,启动 Debug 文件夹中的 exe)。
我还在学习 C++,所以我非常感谢 feedback/help。
谢谢
WebSocketController::HandleReceivedMessages() 中的 AutoPtr 通知将在您为它分配另一个指针后立即被 AutoPtr 删除。但是,此时,该指针已传递到另一个 AutoPtr 中的 NotificationCenter,无论您稍后尝试取消引用(或 AutoPtr 尝试删除)它,都会导致未定义的行为。
将通知指针放入 AutoPtr 后,只需将其作为 AutoPtr 传递(使用 notification.cast此外,永远不会传入 MessageNotification 构造函数指针参数,因为您永远不会构造 MessageNotification 对象(您只是将 Notification* 动态转换为 MessageNotification*)。
查看 NotificationQueue example 以了解如何正确执行此操作。