Learning ROS for Robotics Programming - Second Edition
12.2重新设计前面的例子现在已经介绍了new和delete(以及其他许多主题)。对于本书前面的stash和stack例子,我们可以使用到目前为止讨论的所有技术来重写。检查这个新代码将有助于对这些主题的复习。
12.2.1仅从堆中创建string类此处,类stash和stack自己都将不“拥有”它们指向的对象。即当stash或stack出了范围,它也不会为它指向的对象调用delete。试图使它们成为普通的类是不可能的,原因是它们是void指针。如果delete一个void指针,唯一发生的事是释放了内存,这是因为既没有类型信息也没有办法使得编译器知道要调用哪个析构函数。当一个指针从stash或stack对象返回时,在使用它之前必须将它做类型映射。这个问题将在13章和15章讨论。因为包容器自己不拥有指针,所以用户必须对它负责。这意味着在一个包容器上增加一个指向在栈上创建的对象的指针或增加一个指向在同一个包容器堆上创建的对象的指针时将会发生严重的问题。因为delete表达式对于不在堆上分配的指针是不安全的。(从包容器取回一个指针时,如何知道它的对象已经在哪儿分配了内存呢?)为了在如下一个简单的String类的版本中解决这个问题,下面采取了一些步骤以防止在堆以外的地方创建String:
关于C++编程思想,详细代码请参见delete_string.py。你还可以参考其他资源如c中string类、C++String类以及C++实现string类来获得更深入的理解。
用户评论