流行()礼仪

时间:2012-05-14 06:04:37

标签: c++ oop list pop copying

情况:我正在实现一个类似列表的容器,它支持一个Pop()函数,该函数应该返回用户存储在容器前面的const char *。但是,作为一个实现者,我不确定是否应该返回原始的const char *(从容器中删除节点指针但不在const char *本身上调用delete),或者我是否应该分配新的内存和返回元素的副本。

从类和项目中,我遇到了那些总是复制的人,所以之前没有返回的引用(来自getter等)和指向const char *的指针可以改变弹出的版本,但是因为这种方法需要一个额外的分配和strcpy,我想我会问是否只是简单地将原始的,未删除的指针返回给const char而不删除它真的是一个问题。这是方法的分配和复制的代码片段(之后删除原始引用):

const char* LinkedList::PopHeadString()
{
    node* deletehead = head_;
    char* output = NULL;

    if (head_ != NULL && GetHeadType() == STRING) {
        output = new char[strlen(head_->en.data.str) + 1];
        strcpy(output, head_->en.data.str);
        head_ = head_->next;
        delete deletehead->en.data.str;
        delete deletehead;
        --nEntries_;
    }
    return output;
}

由于Pop()是一个常见的容器操作,我想我会问一般的方法是什么。

提前致谢。

1 个答案:

答案 0 :(得分:4)

如果在没有复制的情况下返回指针,则必须决定谁拥有指针。拥有它的人负责在不再需要时将其删除。这可能是一个非常难的问题,特别是如果您的代码变得更复杂。复制语义更容易理解。

在您的具体示例中,要更改的第一件事是使用std::string而不是const char *来表示字符串。如果您按值返回std::string,则会为您处理复制。

如果你真的想要阻止副本,但仍然优雅地管理生命周期,你应该考虑使用std::shared_ptr<std::string>(如果你没有C ++ 11编译器,则使用boost::shared_ptr<std::string>) 。 shared_ptr使用引用计数来确定何时应该释放它指向的对象,从而承担了手动内存管理的负担,这是一个好主意。