3

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

在课堂和项目中,我遇到过那些始终支持复制的人,因此以前返回的引用(来自 getter 等)和指向 const char* 的指针都不会改变弹出的版本,但是由于这种方法需要额外的分配和strcpy,我想我会问是否只是简单地返回原始的、未删除的指向 const char 的指针而不删除它真的是一个问题。这是 WITH 分配和复制方法的代码片段(然后删除原始引用):

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() 是一种常见的容器操作,我想我会问一般的方法是什么。

4

1 回答 1

4

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

在您的具体示例中,首先要更改的是使用std::string而不是const char *表示字符串。如果您返回std::string按值,它将为您处理复制。

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

于 2012-05-14T06:21:13.207 回答