C++ C++;传递信息的疑虑
我正在写一个软件,它需要在彼此之间交换信息的对象。 消息必须包含以下内容:C++ C++;传递信息的疑虑,c++,memory-management,messages,C++,Memory Management,Messages,我正在写一个软件,它需要在彼此之间交换信息的对象。 消息必须包含以下内容: Peer *srcPeer; const char* msgText; void* payload; int payLoadLen; 现在,Peer必须是一个指针,因为我有另一个类来管理Peer。剩下的我怀疑。。。例如,我可以在创建消息时复制消息文本和有效负载(通过分配两个新的缓冲区),然后将删除放在消息的析构函数中。这样做的最大优点是避免忘记使用者函数中的删除操作(更不用说使这些函数更简单),但它会导致许多分配和复制
Peer *srcPeer;
const char* msgText;
void* payload;
int payLoadLen;
现在,Peer必须是一个指针,因为我有另一个类来管理Peer。剩下的我怀疑。。。例如,我可以在创建消息时复制消息文本和有效负载(通过分配两个新的缓冲区),然后将删除放在消息的析构函数中。这样做的最大优点是避免忘记使用者函数中的删除操作(更不用说使这些函数更简单),但它会导致许多分配和复制,并且会使所有操作都变慢。所以我可能只是分配了指针,仍然让析构函数删除所有东西。。。或这是一种常见的情况,在其他编程语言中甚至不是一个难题,因为存在GC。你的建议是什么?最流行的做法是什么
编辑:
我的意思是,我想知道传递内容的最佳实践是什么。。。就像有另一个对象跟踪它们,或者共享指针。。。如果所有的消息都是相似的,考虑使用一个垃圾堆栈(),这样,你就可以保留一个分配的尚未初始化的消息结构栈,你可以在不使用常数Malc/Flash命中的情况下重用它。 < P>如果所有的消息都是相似的,考虑使用垃圾堆栈()。您可以保留一堆已分配但尚未初始化的消息结构,这些结构可以重复使用,而无需进行持续的malloc/free点击。您需要清除
所有权
:当消息在对等方之间传递时,所有权是否已更改?如果你转换所有权,只需让接收者进行清理
如果您只是“租赁”一条消息,请确保有一个“返回所有者”过程
消息是否共享?然后您可能需要一些复制或具有互斥来保护访问。您需要清除
所有权
:当消息在对等方之间传递时,所有权是否更改?如果你转换所有权,只需让接收者进行清理
如果您只是“租赁”一条消息,请确保有一个“返回所有者”过程
消息是否共享?然后您可能需要一些复制或具有互斥来保护访问。考虑使用
共享\u ptr
,可从Boost获得,也是std::tr1
库的一部分,而不是原始指针。这并不是在所有情况下都能使用的最好方法,但是看起来你想要保持事情的简单,而且它在这方面做得非常好。这是本地引用计数垃圾收集。考虑使用Boost提供的shared\u ptr
,也是std::tr1
库的一部分,而不是原始指针。这并不是在所有情况下都能使用的最好方法,但是看起来你想要保持事情的简单,而且它在这方面做得非常好。它是本地引用计数垃圾收集。< P>在C++中没有规则或甚至最佳的实践,除非你做出关于指针所有权的设计决定并坚持它。
<>你可以尝试使用智能指针来执行特定的策略,或者你可以简单地记录设计的行为,希望每个人都能阅读手册。 < P>在C++中没有规则或者甚至最好的实践,除非你做出关于指针所有权的设计决定并坚持它。
你可以尝试使用智能指针来执行特定的策略,或者你可以简单地记录设计的行为,希望每个人都能阅读手册。
< P> C++,你也可以进行引用计数,比如这里: 在这种情况下,可以传递Glib::RefPtr对象。当与指针关联的最后一个RefPtr-s被销毁时,对象本身被删除 如果您不想使用glibmm,也可以实现它,这并不太困难。另外,STL和boost可能也有类似的功能注意循环引用。C++中的
< P>,也可以进行引用计数,如: 在这种情况下,可以传递Glib::RefPtr对象。当与指针关联的最后一个RefPtr-s被销毁时,对象本身被删除 如果您不想使用glibmm,也可以实现它,这并不太困难。另外,STL和boost可能也有类似的功能注意循环引用。最简单的方法是使用对象来管理缓冲区。例如,您可以对
msgText
和payLoadLen
成员使用std::string
,您可以取消payLoadLen
,因为它将由payloadle.size()
方法处理
如果且仅当您测量此解决方案的性能以及复制msgText
和payload
的行为导致不可接受的性能影响时,您可以选择使用共享指针指向消息副本共享的结构
在(几乎)任何情况下,我都不会依赖于记住在析构函数中调用
delete
,或者手动编写安全复制赋值运算符和复制构造函数。最简单的方法是使用对象来管理缓冲区。例如,您可以对msgText
和payLoadLen
成员使用std::string
,您可以取消payLoadLen
,因为它将由payloadle.size()
方法处理
如果且仅当您测量此解决方案的性能以及复制msgText
和payload
的行为导致不可接受的性能影响时,您可以选择使用共享指针指向消息副本共享的结构
在(几乎)任何情况下,我都不会依赖于记住在析构函数中调用delete
,或者手动编写安全副本分配操作符和