繁体   English   中英

解除分配 <vector <vector<DataClass> &gt;作为班级成员

[英]Deallocating a <vector <vector<DataClass>> as a class member

我有一堂课,我们称它为Builder。 它有一个私有成员声明为

vector< vector< Node >> buffers; // Node is a pure data class.

在此Builder类的构造函数中,我这样做:

buffers = vector< vector< Node >>(amount);

其中“数量”仅在运行时已知。

在构建器类的生存期内,对buffers成员调用了一些操作。 我正在使用的唯一操作是:

buffers[i].push_back(Node());
buffers[i].clear();

我只是在这里添加算法的内容以供参考:

// REFINE BUFFERS
// check all levels (bottom up) and group 8 nodes on a higher level
for(int d = maxdepth; d >= 0; d--){
    if(buffers[d].size() == 8){ // if we have 8 nodes
        if(isBufferEmpty(buffers[d])){ 
            buffers[d-1].push_back(Node()); // push back NULL to represent 8 empty nodes
        } else { 
            buffers[d-1].push_back(groupNodes(octree, buffers[d])); // push back parent node
        }
        buffers[d].clear(); // clear the 8 nodes on this level
    } else {
        break; // break the for loop: no upper levels will need changing
    }
}

当Builder类对象超出范围时,它将被销毁,并且其类成员也将被销毁。 当我处于VS2010调试模式时,没有问题。 在发布模式下,出现以下错误:“ Windows触发了断点”。

问题出在STL:vector规范的此部分中,位于_Destroy调用中。

void _Tidy()
    {   // free all storage
    if (this->_Myfirst != 0)
        {   // something to free, destroy and deallocate it
        this->_Orphan_all();
        _Destroy(this->_Myfirst, this->_Mylast);
        this->_Alval.deallocate(this->_Myfirst,
            this->_Myend - this->_Myfirst);
        }
    this->_Myfirst = 0;
    this->_Mylast = 0;
    this->_Myend = 0;
    }

查看调试器,我可以看到_Mylast的值不正确(0x000000000000),这可能是导致此解除分配失败的原因。 当我尝试最后做buffers.clear()时,我得到相同的结果。 (buffers [i] .clear()工作正常)。 另外,当我点击“继续”时,我的程序也可以正常工作。

运行后,我的算法有一些输出。 您所看到的是各个向量中的元素数量,以及buffers [i] .begin()和buffers [i] .end()指向的地址。 “主缓冲区”是指当我调用buffers.begin()和buffers.end()时获得的值。

  Main Buffer begin: 0000000002068050
  Main Buffer end  : 0000000002068130
  buffers[0] : 0 elements, 0000000002068160 - 0000000002068160
  buffers[1] : 0 elements, 0000000002070080 - 0000000002070080
  buffers[2] : 0 elements, 0000000002068E70 - 0000000002068E70
  buffers[3] : 0 elements, 0000000001F71810 - 0000000001F71810
  buffers[4] : 0 elements, 0000000002068BB0 - 0000000002068BB0
  buffers[5] : 0 elements, 00000000020688F0 - 00000000020688F0
  buffers[6] : 0 elements, 0000000002068370 - 0000000002068370

现在我的问题是,我怎么可能损坏_Mylast? (无论如何,我已经损坏了堆)

当我将以前只是全局范围内定义的函数的算法移到类中时,才开始出现此问题。 我怀疑这与C ++如何将矢量作为类成员进行处理有关。

我的构建器类应该能够设置一定数量的缓冲区(向量填充物),并在活动的前提下将Node弹出并推送到这些缓冲区中。 那就是我想要达到的目标。

即使d为零,也要写入buffers[d-1] 那可能是你的问题吗? 有时直到以后才检测到边界错误(例如,释放向量时)。

确保可以复制并正确销毁您的Node对象; 一个非常常见的错误是让您包含的对象(在本例中为Node )在其析构函数中执行依赖于它的所有基础数​​据的唯一副本的操作。 您可能希望让缓冲区存储shared_ptr<Node>来防止复制开销,或者至少确保已将Node::Node(const Node &)Node::operator=(const Node &)为确保您的复制语义正确(以及将Node内部的所有原始指针也更改为shared_ptr )。

您可能还需要阅读RAII原则 ,因为这将有助于防止将来出现这些错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM