这个问题很长,请多多包涵。
我正在尝试解决我在内存管理、共享指针和映射方面遇到的困境。我只是想得到一些关于我的架构的反馈,也许你们中的一些人过去会做得更好。
下面的例子会做的是伪代码。
我有一个监听器类:
class MyListener {
friend class Command;
public:
MyListener() {}
virtual ~MyListener() {}
void handleUpdate() {
std::cout << "Update Handled" << std::endl;
}
};
每次调用对象更新时都会调用它。我正在使用一个名为 OpenDDS 的中间件来实现进程间通信框架。
我有一个命令类,它继承了一个 DDS 对象,并利用了 on_data_received()。当 on_data_received() 被调用时,我想从上面的类中调用 handleUpdate() 方法。
class Command {
public:
/*standard constructor destructor here*/
void on_data_received() {
m_listener->handleUpdate();
}
void write();
private:
MyListener *m_listener;
};
问题就在这里。管理这个的类是一个 Singleton,并使用两种方法发布和订阅来发布 DDS 消息或订阅一个。subscribe方法接受一个键值和一个原始指针。
单例管理一个
std::map<std::string name, Command>
其中一个Command类包含MyListener类。
这是一个破坏它的伪代码片段:
class TaterTotListener : public MyListener {
void handleCommand() {
std::cout << "Tater tot found" << std::endl;
}
};
int main() {
// make a new smart pointer to the listener
boost::shared_ptr<TaterTotListener> ttl(new TaterTotListener);
// tell the singleton we want to publish an object called "TaterTot"
CommandManager::instance()->publish("TaterTot");
// tell the singleton we want to subscribe to an object called tater tot
CommandManager::isntance()->subscribe("TaterTot", ttl.get());
// processing goes here
// deallocation
}
在解除分配时,boost 正在删除它对共享指针的所有权。CommandManager 尝试通过删除所有名为“TaterTot”的对象来“清理”,但由于 boost::shared_ptr 已经清理了自己,因此引发了双重可用内存损坏。CommandManager 单例总是最后清理,因此声明一个原始指针并传递给 subscribe 方法将导致相同的行为。
有什么想法吗?我错过了一些明显和直观的东西吗?我是否误解了在这种情况下共享指针的使用?
任何帮助是极大的赞赏。我给你买啤酒。