c++ - 如何在节点的结构中初始化向量
问题描述
我的问题如下:
我正在制作一个带有内部节点的 KD 树,如下所示:
struct internalNode {
int DimForDisc; //Dimension For Discrimination
int ValForDisc; //Value For Discrimination
internalNode* leftChild, * rightChild;
vector<vector<int>> leftLeaf;
vector<vector<int>> rightLeaf;
};
作为此过程的一部分,我需要在创建新节点时初始化 vector<vector>。我当前的代码如下所示:(由于限制,我必须使用 malloc/创建自己的构造函数)
internalNode* makeInternalNode(int DimForDisc, int ValForDisc,
internalNode* leftChild, internalNode* rightChild) {
internalNode* PointerToNode = (internalNode*)malloc(sizeof(internalNode));
PointerToNode->DimForDisc = DimForDisc;
PointerToNode->ValForDisc = ValForDisc;
PointerToNode->leftChild = leftChild;
PointerToNode->rightChild = rightChild;
PointerToNode->leftLeaf.clear();
PointerToNode->rightLeaf.clear();
return(PointerToNode);
}
vector<vector<int>>
有一次,在创建节点之后,我尝试通过执行上述实现将 leftLeaf 设置为等于另一个Root->leftLeaf = AccumulatedData;
,如果我尝试执行以下操作,则会导致分段错误:
vector<vector<int>> leftLeaf;
vector<vector<int>> rightLeaf;
PointerToNode->leftLeaf = leftLeaf;
PointerToNode->rightLeaf = rightLeaf;
它会导致 SIGABRT 并说 free(): invalid size 如果我尝试完全忽略初始化向量,那么我会收到以下错误:
Program received signal SIGSEGV, Segmentation fault.
0x0000555555558b76 in std::vector<int, std::allocator<int> >::capacity (this=0xc3b00001716) at /usr/include/c++/9/bits/stl_vector.h:996
996 { return size_type(this->_M_impl._M_end_of_storage
我已经尝试了我能想到的一切,但无济于事。我已经确认 AccumulatedData 保存了正确的信息,因此问题确实出现在尝试将其复制到 InternalNode 的结构中时。任何帮助将不胜感激,可以根据需要添加更多信息。
解决方案
虽然是一个可怕的想法,但使用 malloc/free 需要手动构建小瓶放置 new,并通过显式析构函数调用直接销毁。IE
internalNode* makeInternalNode(int DimForDisc, int ValForDisc,
internalNode* leftChild, internalNode* rightChild) {
internalNode* PointerToNode = (internalNode*)malloc(sizeof(internalNode));
new (PointerToNode) internalNode;
PointerToNode->DimForDisc = DimForDisc;
PointerToNode->ValForDisc = ValForDisc;
PointerToNode->leftChild = leftChild;
PointerToNode->rightChild = rightChild;
// vectors are born clear, so I removed those superfluous executions.
return(PointerToNode);
}
稍后在销毁时(无论在哪里),您必须这样做:
PointerToNode->~internalNode();
free(PointerToNode);
也就是说,我不鼓励尝试混合 C 和 C++ 内存分配和对象管理功能,并建议官方抗议new
正确使用,如果不是首先理想地使用智能指针。
推荐阅读
- python - 从python中的记录创建列
- react-native - react-native-sqlite-storage InternalError Metro
- python - 如何从具有 np 概率数组的 2d np 数组中选择随机行?
- python - 如何在 Flask/WTForms 中添加带有文本字段的单选按钮
- vscode-settings - clang:错误:在 vscode 中打开现有文件时没有这样的文件或目录
- mercurial - 如何显示不包括标签的标签修订的后代?
- html - DropDownFor 更改事件未触发
- hash - Ada Hash_type 转整数
- c# - 字典的可枚举或 Linq Foreach 循环
- r - 将不同文件中的多列写入R中的一个数据帧