Twa*_*kar 1 c++ messaging void-pointers
我正在尝试在我的C++应用程序中实现通用消息传递系统.
该程序被分为不同的系统,处理渲染,图像加载等不同的事情.我希望它们能够将消息推送到消息堆栈中,并使用某种类型的数据进行传输.
为了实现这一点,我制作了一个允许这样的API:
MessageStack.add(System * sender,
System * receiver,
MessageCodeEnum message_type,
void * data);
Run Code Online (Sandbox Code Playgroud)
该变量message_type是一个枚举,它定义了所有消息命令,并且void * data应该是附加到消息的数据.这些消息以堆栈形式排列,并在每帧结束时进行评估.
假设要加载图像的renderer消息fileLoader.该renderer会添加一条消息,告诉fileLoader加载图像和消息将有一个void *在它里面,它实际上是一个const char *指向包含图像文件的路径为C字符串.
内部在处理该消息的功能的开关壳体块,我已经型铸这是一个消息数据void *到一个const char *使用普通的旧方式:
const char * temp = (const char *) data;
Run Code Online (Sandbox Code Playgroud)
现在这让我想到了这个问题.如果在任何消息事务中,程序知道正在传输什么类型的数据,这就是为什么我在输入类型时感到自信void *,那么使用void *真的是一种不安全的方法来实现这样的功能吗?有没有更好的方法来实现这种松散的类型检查?
使用void指针本质上是不安全的,因为程序员滥用它们非常容易,而且编译器很少能够诊断误操作.程序员也倾向于对编写优秀代码的能力过于自信,这在使用void指针时效果不佳,因为它们很容易被滥用.
如果你犯了一个错误,并且错误地使用了指针(例如,将它转换为X *实际指向的位置X,然后访问Xvia指针的成员),那么代码的行为是不确定的.
更糟糕的是,程序员倾向于认为"我可以找到我用指针弄错的地方,因为程序会崩溃".可悲的是:这往往是不真实的.许多指针错误 - 尤其是指针的误用 - void通过编译和测试而没有错误.要么是因为它们在测试中被遗漏了(程序员认为不会发生这种情况,所以没有对它进行测试),或者因为错误的结果不是崩溃(例如程序中的中毒数据,例如覆盖无辜的变量,很少在它发生时检测到).由于滥用void指针,滥用可能非常微妙,以至于错误在相当长的时间内仍然未被发现,这些症状会影响不相关的代码,因此很难找到原因.
您可以通过精心设计(以更难以滥用指针的方式设计它),仔细编码(最小化将设计转换为代码时的错误)和详尽测试(全面测试)来减轻缺乏安全性的影响您的代码可以帮助您提高代码不会滥用这些指针的信心.简而言之,您需要付出努力和时间.但是,想念一件事,你就麻烦了.在设计过程中错过了一个特定的角落案例,并且您的程序将存在导致指针误用的设计缺陷.引入一个错误导致指针被误用,你就麻烦了.在测试过程中不要运用那个设计缺陷,并且在最坏的情况下,你的程序用户会等待找到一个bug.
一般来说,最好使用不涉及使用void指针的技术.指定数据和消息的接口,然后检查.以类型安全的方式提供您的数据.使用具有精心设计的操作集的多态基类.选项列表继续.
如果你耗尽所有其他设计可能性,那么 - 是的 - 考虑使用void指针.但接受它们是危险的,因此需要花费大量精力来确保您的邮件系统是健壮的,并最大限度地减少其他人(开发人员或最终用户)打破它的机会.
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |