删除当前对象并创建一个新对象数组

时间:2010-09-30 23:03:11

标签: c++ constructor destructor

有一个成员函数,我想删除当前对象并在其位置创建一个新数组。这怎么可能?以下代码是我的尝试,它有很多错误。

void LernaeanHydra::split(int parts)
{
    LernaeanHydra *new_heads = new LernaeanHydra[parts];
    for (int i = 0; i < parts; i++) {
        std::vector<LernaeanHydra *> child123;
        for (int j = i * parts; j < (i + 1) * parts; j++) {
            child123[j] = children[i * parts + j];
        }
        new_heads[i] = LernaeanHydra(child123, num_children/parts);
    }

    delete this;
}

我已经读过,我们永远不应该明确地调用析构函数,我们不应该尝试delete this

2 个答案:

答案 0 :(得分:2)

当您在树中拆分节点时,通常从一个节点开始,该节点包含指向其子节点的指针向量。然后,您将创建一个新节点,其中包含指向其子节点的指针向量,您可以使用当前节点的一半子指针初始化这些节点。然后,你从当前节点中删除那些指针 - 但你肯定不会破坏它(即使在“赠送”一半数据之后,它仍然保留了你不想丢弃的相当数量)。

class Node { 
    // for the moment I'm ignoring the keys, though they'd also be needed for any
    // of this to accomplish much.
    std:vector<Node *> children;
    typedef std::vector<Node *>::iterator child_it;
public:
    Node(child_it begin, child_it end) : children(begin, end) {}

    Node *split() {
        size_t center = children.size() / 2;

        Node *new_node = new Node(children.begin()+center, children.end());
        children.erase(children.begin() + center, children.end());
        return new_node;
    }
};

请注意,在C ++ 0x中,你可能想要移动指针而不是复制然后销毁原件(虽然假设它们是指针,它可能不会产生任何真正的区别)。

另请注意,这应该是异常安全的 - 如果分配/初始化新节点失败,throw将阻止children.erase执行,因此节点将保持原样。在我们确保创建新节点并将其复制到它之后,我们只删除了额外的指针。

答案 1 :(得分:1)

也许您需要一个使用节点成员初始化的虚拟节点,然后它可以正确处理拆分功能:

Class Node {
public:
  Node() {
    obj = new Obj();
    issplit = false;
  }
  ~Node() {
    if (issplit) delete [] obj; else delete obj;
  }
  void split(int p) {
    if (!issplit) {
      delete obj;
      obj = new Obj[p];
    }
  }
private:
  Obj* obj;
  bool issplit;
}