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
,或者手动编写安全副本分配操作符和