我有一个相当大的遗留应用程序,它只使用普通指针。 现在我正在添加一个新模块,试图使用“更现代的东西”,例如智能指针。
主模块通过通信DLL将消息发送到我的新子模块(使用普通指针)。 在我的新子模块中,我使用shared_pointer进行消息处理。 当共享指针尝试删除指针时,我在消息的结构中得到访问冲突,因为VTable指针是0xdddddddd。我已经找到了this SO question,它说这是因为指针已经被释放了。
在共享指针删除之前,主模块似乎已经删除了正常指针。
我不想在旧的主模块中使用共享指针(此时会非常重构),但是有一个解决方案,我可以在我的应用程序中使用普通和共享指针吗? 析构函数中通常的NULL检查没有帮助。
答案 0 :(得分:1)
您需要确保主模块传输指针的所有权 即:在将该地址发送到您的模块后,它不应该保留任何指向该地址的指针。否则它可能会释放指针,使模块悬挂指针。
因此,如果主模块维护对指针的引用,那么仅为您的模块使用shard_ptr
没有意义。在这种情况下,您还需要在主模块中使用shared_ptr
。
此外,您需要确保为shared_ptr::deleter()
中的指针使用适当的内存释放例程。
可能是分配和释放例程中的错误匹配用于指针。