如何解决如何在节点的结构中初始化 Vector
我的问题如下:
我正在制作一个带有内部节点的 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
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,并通过显式析构函数调用直接销毁。即
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
,如果不是首先理想地使用智能指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。