在代码的一些地方,我有一个struct
定义如下:
typedef struct tagNameOfStruct{
//some methods and members
}T_NameOfStruct, * PT_NameOfStruct, FAR LPT_NameOfStruct;
typedef struct tagNameOfStructLists{
//some methods and members
}T_NameOfStructLists, * PT_NameOfStructLists, FAR LPT_NameOfStructLists;
typedef pair<T_NameOfStruct, T_NameOfStructLists> CStructPair;
typedef map<T_NameOfStruct, T_NameOfStructLists> CStructMap;
在循环内的方法中,我看不到下面的代码行
T_NameOfStruct instance;
T_NameOfStructLists listInstance;
m_MapInstance.insert(CStructPair(instance, listInstance));
//structMapInstance is a members of method class of type CStructMap
该实例将插入到函数范围之外使用的数据结构中,并通过引用传递给数据结构。
编辑----为什么不是重复的,请重新打开----::结构定义中的* PT_NameOfStruct,FAR LPT_NameOfStruct与你们所链接的问题也不同。另外,在方法堆栈上定义实例时,存在通过ref传递实例的问题。奇怪的是该代码有效,所以我想知道我在这里缺少什么。在尝试遍历数据结构的其他函数中访问被破坏的对象时,为什么没有出现异常。还是认为这是重复的吗?
当我们离开函数范围时,实例不应该死吗?
是的。如果您未显示给我们的代码在此之后实际上使用了对它的引用,那么这是错误的。但是由于我们看不到它,所以我们只能猜测它是否能够做到这一点。
更新:现在您已经向我们展示了实际发生的情况,它正在传递给map::insert
,它存储其自变量的副本(即使它通过引用获取自变量)。instance
假设它具有有效的复制语义,则销毁自身不会有任何问题。
struct定义的结尾是什么意思?
它声明:
tagNameOfStruct
。T_NameOfStruct
。在C ++中,这是完全没有意义的。在C语言中,有些人有这样做的坏习惯,以便struct
在指定类型时避免键入。PT_NameOfStruct
。这比第一个typedef还要糟糕,因为它隐藏了重要的信息,即某些东西是指针。LPT_NameOfStruct
。这是16位平台的宿醉;在现代平台上,它将与常规指针类型相同。不要将其用作声明类类型的模型。最好保持简单:
class NameOfStruct { // or "struct", if you want members to be public by default
// members
};
NameOfStruct instance; // No need for a typedef
NameOfStruct * pointer; // Make it clear that it's a pointer
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句