微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在节点的结构中初始化 Vector

如何解决如何在节点的结构中初始化 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。我当前的代码如下所示:(由于限制,我必须使用 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,并通过显式析构函数调用直接销毁。即

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?