Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 澄清C+中结构中数据类型的析构函数要求+;_C++_Struct_Destructor - Fatal编程技术网

C++ 澄清C+中结构中数据类型的析构函数要求+;

C++ 澄清C+中结构中数据类型的析构函数要求+;,c++,struct,destructor,C++,Struct,Destructor,结构的析构函数: 能否指定必须在结构的析构函数中显式处理的每种数据类型 struct Node { int val; // representing any/all primitive data types int* ptrToVal; // representing any/all pointers to primitive data types int arr[5]; // representin

结构的析构函数: 能否指定必须在结构的析构函数中显式处理的每种数据类型

struct Node {
    int val;                // representing any/all primitive data types
    int* ptrToVal;          // representing any/all pointers to primitive data types
    int arr[5];             // representing any/all arrays
    int* ptrToArr[5];       // representing any/all array of pointers
    Node* next;             // pointer to a struct
    vector<Node> vOfNodes;  // vector of structs
    vector<Node*> vOfPtrs;  // vector of struct pointers
    unordered_map<int, Node*> um; //representing any pre-existing class template
    
// Default constructor
    Node() : val(0), ptrToVal(nullptr), arr(), ptrToArr(), next(nullptr),
    vOfNodes(), vOfPtrs(), um(){}

//Overloaded constructor
    Node(int val, int* toVal, Node* n, vector<Node> vN, vector<Node*> toV, 
    unordered_map<int, Node*> m) 
    : val(val), ptrToVal(toVal), arr(), ptrToArr(), next(n),    
      vOfNodes(vN), vOfPtrs(toV), um(m){}
struct节点{
int val;//表示任何/所有基元数据类型
int*ptrToVal;//表示指向基元数据类型的任何/所有指针
int arr[5];//表示任意/所有数组
int*ptrToArr[5];//表示任何/所有指针数组
Node*next;//指向结构的指针
向量vOfNodes;//结构的向量
vector vOfPtrs;//结构指针的向量
无序的_-map um;//表示任何预先存在的类模板
//默认构造函数
节点():val(0),ptrToVal(nullptr),arr(),ptrToArr(),next(nullptr),
vOfNodes(),vOfPtrs(),um(){}
//重载构造函数
节点(int-val,int*toVal,节点*n,向量vN,向量toV,
无序(图m)
:val(val),ptrToVal(toVal),arr(),ptrtoar(),next(n),
vOfNodes(vN),vOfPtrs(toV),um(m){}
需要向节点结构的析构函数中添加什么?是否有其他我没有想到的复杂数据结构也需要析构函数中的非平凡代码

需要向节点结构的析构函数添加什么

根据显示的代码,没有。猜测一个合理的数量,可能是一些
delete
语句。理想情况下,没有

析构函数主要用于“撤消”当对象的生命周期结束时,与对象相关联的较早的动作——如对应的<代码>删除>代码>到<代码>新< /C> >,或接近打开的文件,或重置的临时配置,变回原件,或其他。但是,在现有的成员中,没有任何需要C++代码来撤消。

尽管这些成员中有一些是或包含“不明确的指针”。我们不能仅仅通过查看它们的使用方式来判断:指向任何特定对象的指针可以到达那里吗?只有来自
new
表达式的指针?如果它们来自
new
表达式,结构是否“负责”用最终的
delete
(或
delete[]
)进行清理,或者
new
表达式中的代码是否仍对此负责?这些问题可能适用于涉及的每个指针:
ptrToVal
next
,以及
ptrToArr
中的元素(名称错误)和/或
um

如果答案是该结构不负责执行
删除
,那么“原始指针”毕竟是一个不错的选择,并且该结构不需要声明析构函数。(C++将自动给它一个析构函数,并在需要时定义它。)

如果答案是结构应该对其中一些指针执行一些
删除
,那么我们可以定义它的析构函数来执行。但是更好的是,我们可以将成员从原始指针更改为智能指针,比如
std::unique\u ptr next;
std::vector vOfPtrs;
。智能指针是一种RAII句柄(资源分配是初始化)

C++中的RAII句柄:

  • 让我们更清楚地了解清理责任的模式
  • new
    delete
    或其他Do/Undo操作被误用时,可避免出现令人讨厌且难以发现的错误
  • 首先,避免我们编写大量重复的代码
  • 如果在构造函数之前或期间发生了应该自动撤消的事情,那么可以避免我们为了异常安全而显式地处理额外的棘手情况
因此,如果适当地使用了智能指针,它们将承担撤消操作的责任,更高级别的结构根本不需要析构函数

然后,编写析构函数的另一个原因不仅仅是
=default;
{}
是在实现一个全新的RAII句柄时,如果它不是由
std::unique\u ptr
轻松完成的。由于RAII句柄应该只包含一个要撤消的操作,这通常是一个单语句析构函数。

任何东西都可能需要显式销毁:
int
可以是要关闭的文件描述符,而n索引到数组中(对象外部)标识要以某种方式最终确定的对象,或由于类型擦除原因而存储为
std::uintpttr\u t
的指针。函数指针可以是要调用的已注册清理函数。具有自己析构函数的对象可能包含其不知道如何处理的任何类型的信息

另一方面,原始对象指针(显式销毁的海报子对象)可能只是指向另一个数据结构的非拥有(“观察”)指针,根本不需要清理


所以没有预先确定的答案:你必须考虑对象为什么有每个成员以及它的强>拥有< /强>。

现在应该删除它吗?<代码> int *pTrtoRoad(5)< /C>不是一个指向数组的指针,而是一个指针数组。谢谢大家。删除了1550个字符,分成了2个问题。