c++ - Pop() 礼仪

标签 c++ list oop 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() 是一种常见的容器操作,我想我应该问一下一般方法是什么。

最佳答案

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

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

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

关于c++ - Pop() 礼仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10578150/

相关文章:

c++ - 为什么 C++ 允许您在初始定义中引用已声明的变量?

c++ - 在不强制转换的情况下打印 time_t 为 long int 会产生意外行为

python - 当方法访问实例变量时减少语法上的麻烦?

Android 自定义列表对话框

php - 对象标识符的副本和对对象标识符的引用——在实际应用中应该使用哪一个?

c++ - 单例模式与工厂模式的争议

c++ - 这如何解决访问冲突问题?

c++ - 如何修复 openGL 中的位图照明?

python - 尝试为一个月中的每一天创建文件

list - 将元素添加到列表末尾的最简单方法是什么?