首页 > 解决方案 > 如何在节点的结构中初始化向量

问题描述

我的问题如下:

我正在制作一个带有内部节点的 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 的结构中时。任何帮助将不胜感激,可以根据需要添加更多信息。

标签: c++vectorinitializationnodeskdtree

解决方案


虽然是一个可怕的想法,但使用 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正确使用,如果不是首先理想地使用智能指针。


推荐阅读